Django

Code

Changeset 4372

Show
Ignore:
Timestamp:
01/20/07 15:16:31 (2 years ago)
Author:
adrian
Message:

newforms-admin: Made the first step in converting add and change forms to use newforms. Got rid of some overengineered admin template tags along the way.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/newforms-admin/django/contrib/admin/options.py

    r4365 r4372  
    11from django import oldforms, template 
     2from django import newforms as forms 
    23from django.core.exceptions import ImproperlyConfigured, PermissionDenied 
    34from django.db import models 
     
    6869        return len(self.fields) 
    6970 
    70 # New implementation of Fieldset 
     71class AdminForm(object): 
     72    def __init__(self, form, fieldsets): 
     73        self.form, self.fieldsets = form, fieldsets 
     74 
     75    def __iter__(self): 
     76        for fieldset in self.fieldsets: 
     77            yield BoundFieldset(self.form, fieldset) 
     78 
    7179class Fieldset(object): 
    7280    def __init__(self, name=None, fields=(), classes=(), description=None): 
     
    7482        self.classes = ' '.join(classes) 
    7583        self.description = description 
     84 
     85class BoundFieldset(object): 
     86    def __init__(self, form, fieldset): 
     87        self.form, self.fieldset = form, fieldset 
     88 
     89    def __iter__(self): 
     90        for field in self.fieldset.fields: 
     91            yield BoundFieldline(self.form, field) 
     92 
     93class BoundFieldline(object): 
     94    def __init__(self, form, field): 
     95        self.form = form # A django.forms.Form instance 
     96        if isinstance(field, basestring): 
     97            self.fields = [field] 
     98        else: 
     99            self.fields = field 
     100 
     101    def __iter__(self): 
     102        for i, field in enumerate(self.fields): 
     103            yield BoundField(self.form, field, is_first=(i == 0)) 
     104 
     105    def errors(self): 
     106        return u'\n'.join([self.form[f].errors.as_ul() for f in self.fields]) 
     107 
     108class BoundField(object): 
     109    def __init__(self, form, field, is_first): 
     110        self.field = form[field] # A django.forms.BoundField instance 
     111        self.is_first = is_first # Whether this field is first on the line 
     112        self.is_checkbox = isinstance(self.field.field.widget, forms.CheckboxInput) 
     113 
     114    def label_tag(self): 
     115        classes = [] 
     116        if self.is_checkbox: 
     117            classes.append('vCheckboxLabel') 
     118            contents = escape(self.field.label) 
     119        else: 
     120            contents = escape(self.field.label) + ':' 
     121        if self.field.field.required: 
     122            classes.append('required') 
     123        if not self.is_first: 
     124            classes.append('inline') 
     125        attrs = classes and {'class': ' '.join(classes)} or {} 
     126        return self.field.label_tag(contents=contents, attrs=attrs) 
    76127 
    77128class ModelAdmin(object): 
     
    203254            post_url = '../../../' 
    204255 
    205         manipulator = model.AddManipulator() 
     256        ModelForm = forms.form_for_model(model) 
     257 
    206258        if request.POST: 
    207259            new_data = request.POST.copy() 
    208  
    209260            if opts.has_field_type(models.FileField): 
    210261                new_data.update(request.FILES) 
    211  
    212             errors = manipulator.get_validation_errors(new_data) 
    213             manipulator.do_html2python(new_data) 
    214  
    215             if not errors: 
    216                 new_object = manipulator.save(new_data) 
     262            form = ModelForm(new_data) 
     263 
     264            if form.is_valid(): 
     265                new_object = form.save(commit=True) 
    217266                pk_value = new_object._get_pk_val() 
    218267                LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), ADDITION) 
     
    237286                    return HttpResponseRedirect(post_url) 
    238287        else: 
    239             # Add default data. 
    240             new_data = manipulator.flatten_data() 
    241  
    242             # Override the defaults with GET params, if they exist. 
    243             new_data.update(dict(request.GET.items())) 
    244  
    245             errors = {} 
    246  
    247         # Populate the FormWrapper. 
    248         form = oldforms.FormWrapper(manipulator, new_data, errors) 
     288            form = ModelForm(initial=request.GET) 
    249289 
    250290        c = template.RequestContext(request, { 
    251291            'title': _('Add %s') % opts.verbose_name, 
    252             'oldform': form, 
     292            'adminform': AdminForm(form, self.fieldsets_add(request)), 
     293            'oldform': oldforms.FormWrapper(model.AddManipulator(), {}, {}), 
    253294            'is_popup': request.REQUEST.has_key('_popup'), 
    254295            'show_delete': False, 
    255296        }) 
    256297 
    257         return render_change_form(self, model, manipulator, c, add=True) 
     298        return render_change_form(self, model, model.AddManipulator(), c, add=True) 
    258299 
    259300    def change_view(self, request, object_id): 
     
    273314 
    274315        try: 
    275             manipulator = model.ChangeManipulator(object_id) 
     316            obj = model._default_manager.get(pk=object_id) 
    276317        except model.DoesNotExist: 
    277318            raise Http404('%s object with primary key %r does not exist' % (model_name, escape(object_id))) 
    278319 
     320        ModelForm = forms.form_for_instance(obj) 
     321 
    279322        if request.POST: 
    280323            new_data = request.POST.copy() 
    281  
    282324            if opts.has_field_type(models.FileField): 
    283325                new_data.update(request.FILES) 
    284  
    285             errors = manipulator.get_validation_errors(new_data) 
    286             manipulator.do_html2python(new_data) 
    287  
    288             if not errors: 
    289                 new_object = manipulator.save(new_data) 
     326            form = ModelForm(new_data) 
     327 
     328            if form.is_valid(): 
     329                new_object = form.save(commit=True) 
    290330                pk_value = new_object._get_pk_val() 
    291331 
    292                 # Construct the change message. 
     332                # Construct the change message. TODO: Temporarily commented-out, 
     333                # as manipulator object doesn't exist anymore, and we don't yet 
     334                # have a way to get fields_added, fields_changed, fields_deleted. 
    293335                change_message = [] 
    294                 if manipulator.fields_added: 
    295                     change_message.append(_('Added %s.') % get_text_list(manipulator.fields_added, _('and'))) 
    296                 if manipulator.fields_changed: 
    297                     change_message.append(_('Changed %s.') % get_text_list(manipulator.fields_changed, _('and'))) 
    298                 if manipulator.fields_deleted: 
    299                     change_message.append(_('Deleted %s.') % get_text_list(manipulator.fields_deleted, _('and'))) 
    300                 change_message = ' '.join(change_message) 
     336                #if manipulator.fields_added: 
     337                    #change_message.append(_('Added %s.') % get_text_list(manipulator.fields_added, _('and'))) 
     338                #if manipulator.fields_changed: 
     339                    #change_message.append(_('Changed %s.') % get_text_list(manipulator.fields_changed, _('and'))) 
     340                #if manipulator.fields_deleted: 
     341                    #change_message.append(_('Deleted %s.') % get_text_list(manipulator.fields_deleted, _('and'))) 
     342                #change_message = ' '.join(change_message) 
    301343                if not change_message: 
    302344                    change_message = _('No fields changed.') 
     
    320362                    return HttpResponseRedirect("../") 
    321363        else: 
    322             # Populate new_data with a "flattened" version of the current data. 
    323             new_data = manipulator.flatten_data() 
    324  
    325             # TODO: do this in flatten_data... 
    326             # If the object has ordered objects on its admin page, get the existing 
    327             # order and flatten it into a comma-separated list of IDs. 
    328             id_order_list = [] 
    329             for rel_obj in opts.get_ordered_objects(): 
    330                 id_order_list.extend(getattr(manipulator.original_object, 'get_%s_order' % rel_obj.object_name.lower())()) 
    331             if id_order_list: 
    332                 new_data['order_'] = ','.join(map(str, id_order_list)) 
    333             errors = {} 
    334  
    335         # Populate the FormWrapper. 
    336         form = oldforms.FormWrapper(manipulator, new_data, errors) 
    337         form.original = manipulator.original_object 
    338         form.order_objects = [] 
    339  
    340         # TODO: Should be done in flatten_data  / FormWrapper construction 
    341         for related in opts.get_followed_related_objects(): 
    342             wrt = related.opts.order_with_respect_to 
    343             if wrt and wrt.rel and wrt.rel.to == opts: 
    344                 func = getattr(manipulator.original_object, 'get_%s_list' % 
    345                         related.get_accessor_name()) 
    346                 orig_list = func() 
    347                 form.order_objects.extend(orig_list) 
     364            form = ModelForm() 
     365 
     366        ## Populate the FormWrapper. 
     367        #oldform = oldforms.FormWrapper(manipulator, new_data, errors) 
     368        #oldform.original = manipulator.original_object 
     369        #oldform.order_objects = [] 
     370 
     371        ## TODO: Should be done in flatten_data  / FormWrapper construction 
     372        #for related in opts.get_followed_related_objects(): 
     373            #wrt = related.opts.order_with_respect_to 
     374            #if wrt and wrt.rel and wrt.rel.to == opts: 
     375                #func = getattr(manipulator.original_object, 'get_%s_list' % 
     376                        #related.get_accessor_name()) 
     377                #orig_list = func() 
     378                #oldform.order_objects.extend(orig_list) 
    348379 
    349380        c = template.RequestContext(request, { 
    350381            'title': _('Change %s') % opts.verbose_name, 
    351             'oldform': form, 
     382            'adminform': AdminForm(form, self.fieldsets_change(request, object_id)), 
     383            'oldform': oldforms.FormWrapper(model.ChangeManipulator(object_id), {}, {}), 
    352384            'object_id': object_id, 
    353             'original': manipulator.original_object
     385            'original': obj
    354386            'is_popup': request.REQUEST.has_key('_popup'), 
    355387        }) 
    356         return render_change_form(self, model, manipulator, c, change=True) 
     388        return render_change_form(self, model, model.ChangeManipulator(object_id), c, change=True) 
    357389 
    358390    def changelist_view(self, request): 
  • django/branches/newforms-admin/django/contrib/admin/templates/admin/change_form.html

    r4365 r4372  
    3535{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %} 
    3636{% if save_on_top %}{% submit_row %}{% endif %} 
    37 {% if oldform.error_dict %} 
     37{% if adminform.form.errors %} 
    3838    <p class="errornote"> 
    39     {% blocktrans count oldform.error_dict.items|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} 
     39    {% blocktrans count adminform.form.errors.items|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %} 
    4040    </p> 
    4141{% endif %} 
    42 {% for bound_field_set in bound_field_sets %} 
    43    <fieldset class="module aligned {{ bound_field_set.classes }}"> 
    44     {% if bound_field_set.name %}<h2>{{ bound_field_set.name }}</h2>{% endif %} 
    45     {% if bound_field_set.description %}<div class="description">{{ bound_field_set.description }}</div>{% endif %} 
    46     {% for bound_field_line in bound_field_set %} 
    47         {% admin_field_line bound_field_line %} 
    48         {% for bound_field in bound_field_line %} 
    49             {% filter_interface_script_maybe bound_field %} 
     42 
     43{% for bfset in adminform %} 
     44    <fieldset class="module aligned {{ bfset.fieldset.classes }}"> 
     45    {% if bfset.fieldset.name %}<h2>{{ bfset.fieldset.name }}</h2>{% endif %} 
     46    {% if bfset.fieldset.description %}<div class="description">{{ bfset.fieldset.description }}</div>{% endif %} 
     47    {% for line in bfset %} 
     48        <div class="form-row{% if line.errors %} errors{% endif %}"> 
     49        {{ line.errors }} 
     50        {% for field in line %} 
     51            {% if field.is_checkbox %} 
     52                {{ field.field }}{{ field.label_tag }} 
     53            {% else %} 
     54                {{ field.label_tag }}{{ field.field }} 
     55            {% endif %} 
     56            {% if field.help_text %}<p class="help">{{ field.help_text }}</p>{% endif %} 
    5057        {% endfor %} 
     58        </div> 
    5159    {% endfor %} 
    52    </fieldset> 
     60    </fieldset> 
    5361{% endfor %} 
     62 
    5463{% block after_field_sets %}{% endblock %} 
     64 
    5565{% if change %} 
    5666   {% if ordered_objects %} 
     
    6272   {% endif %} 
    6373{% endif %} 
     74 
    6475{% for related_object in inline_related_objects %}{% edit_inline related_object %}{% endfor %} 
     76 
    6577{% block after_related_objects %}{% endblock %} 
     78 
    6679{% submit_row %} 
     80 
    6781{% if add %} 
    6882   <script type="text/javascript">document.getElementById("{{ first_form_field_id }}").focus();</script> 
    6983{% endif %} 
     84 
    7085{% if auto_populated_fields %} 
    7186   <script type="text/javascript"> 
     
    7388   </script> 
    7489{% endif %} 
     90 
    7591</div> 
    7692</form></div> 
  • django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py

    r4365 r4372  
    4848    } 
    4949submit_row = register.inclusion_tag('admin/submit_line.html', takes_context=True)(submit_row) 
    50  
    51 def field_label(bound_field): 
    52     class_names = [] 
    53     if isinstance(bound_field.field, models.BooleanField): 
    54         class_names.append("vCheckboxLabel") 
    55         colon = "" 
    56     else: 
    57         if not bound_field.field.blank: 
    58             class_names.append('required') 
    59         if not bound_field.first: 
    60             class_names.append('inline') 
    61         colon = ":" 
    62     class_str = class_names and ' class="%s"' % ' '.join(class_names) or '' 
    63     return '<label for="%s"%s>%s%s</label> ' % (bound_field.element_id, class_str, \ 
    64         capfirst(bound_field.field.verbose_name), colon) 
    65 field_label = register.simple_tag(field_label) 
    6650 
    6751class FieldWidgetNode(template.Node): 
     
    217201    return EditInlineNode(bits[1]) 
    218202edit_inline = register.tag(edit_inline) 
    219  
    220 def admin_field_line(context, argument_val): 
    221     if isinstance(argument_val, AdminBoundField): 
    222         bound_fields = [argument_val] 
    223     else: 
    224         bound_fields = [bf for bf in argument_val] 
    225     add = context['add'] 
    226     change = context['change'] 
    227  
    228     class_names = ['form-row'] 
    229     for bound_field in bound_fields: 
    230         for f in bound_field.form_fields: 
    231             if f.errors(): 
    232                 class_names.append('errors') 
    233                 break 
    234  
    235     # Assumes BooleanFields won't be stacked next to each other! 
    236     if isinstance(bound_fields[0].field, models.BooleanField): 
    237         class_names.append('checkbox-row') 
    238  
    239     return { 
    240         'add': context['add'], 
    241         'change': context['change'], 
    242         'bound_fields': bound_fields, 
    243         'class_names': " ".join(class_names), 
    244     } 
    245 admin_field_line = register.inclusion_tag('admin/field_line.html', takes_context=True)(admin_field_line)