Changeset 4372
- Timestamp:
- 01/20/07 15:16:31 (2 years ago)
- Files:
-
- django/branches/newforms-admin/django/contrib/admin/options.py (modified) (7 diffs)
- django/branches/newforms-admin/django/contrib/admin/templates/admin/change_form.html (modified) (3 diffs)
- django/branches/newforms-admin/django/contrib/admin/templates/admin/field_line.html (deleted)
- django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/newforms-admin/django/contrib/admin/options.py
r4365 r4372 1 1 from django import oldforms, template 2 from django import newforms as forms 2 3 from django.core.exceptions import ImproperlyConfigured, PermissionDenied 3 4 from django.db import models … … 68 69 return len(self.fields) 69 70 70 # New implementation of Fieldset 71 class 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 71 79 class Fieldset(object): 72 80 def __init__(self, name=None, fields=(), classes=(), description=None): … … 74 82 self.classes = ' '.join(classes) 75 83 self.description = description 84 85 class 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 93 class 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 108 class 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) 76 127 77 128 class ModelAdmin(object): … … 203 254 post_url = '../../../' 204 255 205 manipulator = model.AddManipulator() 256 ModelForm = forms.form_for_model(model) 257 206 258 if request.POST: 207 259 new_data = request.POST.copy() 208 209 260 if opts.has_field_type(models.FileField): 210 261 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) 217 266 pk_value = new_object._get_pk_val() 218 267 LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), ADDITION) … … 237 286 return HttpResponseRedirect(post_url) 238 287 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) 249 289 250 290 c = template.RequestContext(request, { 251 291 'title': _('Add %s') % opts.verbose_name, 252 'oldform': form, 292 'adminform': AdminForm(form, self.fieldsets_add(request)), 293 'oldform': oldforms.FormWrapper(model.AddManipulator(), {}, {}), 253 294 'is_popup': request.REQUEST.has_key('_popup'), 254 295 'show_delete': False, 255 296 }) 256 297 257 return render_change_form(self, model, m anipulator, c, add=True)298 return render_change_form(self, model, model.AddManipulator(), c, add=True) 258 299 259 300 def change_view(self, request, object_id): … … 273 314 274 315 try: 275 manipulator = model.ChangeManipulator(object_id)316 obj = model._default_manager.get(pk=object_id) 276 317 except model.DoesNotExist: 277 318 raise Http404('%s object with primary key %r does not exist' % (model_name, escape(object_id))) 278 319 320 ModelForm = forms.form_for_instance(obj) 321 279 322 if request.POST: 280 323 new_data = request.POST.copy() 281 282 324 if opts.has_field_type(models.FileField): 283 325 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) 290 330 pk_value = new_object._get_pk_val() 291 331 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. 293 335 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) 301 343 if not change_message: 302 344 change_message = _('No fields changed.') … … 320 362 return HttpResponseRedirect("../") 321 363 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) 348 379 349 380 c = template.RequestContext(request, { 350 381 '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), {}, {}), 352 384 'object_id': object_id, 353 'original': manipulator.original_object,385 'original': obj, 354 386 'is_popup': request.REQUEST.has_key('_popup'), 355 387 }) 356 return render_change_form(self, model, m anipulator, c, change=True)388 return render_change_form(self, model, model.ChangeManipulator(object_id), c, change=True) 357 389 358 390 def changelist_view(self, request): django/branches/newforms-admin/django/contrib/admin/templates/admin/change_form.html
r4365 r4372 35 35 {% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %} 36 36 {% if save_on_top %}{% submit_row %}{% endif %} 37 {% if oldform.error_dict%}37 {% if adminform.form.errors %} 38 38 <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 %} 40 40 </p> 41 41 {% 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 %} 50 57 {% endfor %} 58 </div> 51 59 {% endfor %} 52 </fieldset>60 </fieldset> 53 61 {% endfor %} 62 54 63 {% block after_field_sets %}{% endblock %} 64 55 65 {% if change %} 56 66 {% if ordered_objects %} … … 62 72 {% endif %} 63 73 {% endif %} 74 64 75 {% for related_object in inline_related_objects %}{% edit_inline related_object %}{% endfor %} 76 65 77 {% block after_related_objects %}{% endblock %} 78 66 79 {% submit_row %} 80 67 81 {% if add %} 68 82 <script type="text/javascript">document.getElementById("{{ first_form_field_id }}").focus();</script> 69 83 {% endif %} 84 70 85 {% if auto_populated_fields %} 71 86 <script type="text/javascript"> … … 73 88 </script> 74 89 {% endif %} 90 75 91 </div> 76 92 </form></div> django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py
r4365 r4372 48 48 } 49 49 submit_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)66 50 67 51 class FieldWidgetNode(template.Node): … … 217 201 return EditInlineNode(bits[1]) 218 202 edit_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 break234 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)
