Version 6 (modified by 19 years ago) ( diff ) | ,
---|
New-admin changes ¶
The new-admin branch contains a number of changes. All of these changes may be reverted (more likely with some than others) or further modified.
View Functions ¶
For view functions to work properly with all new features, a few changes are in order.
From:
def style_edit(request, object_id): try: manipulator = styles.ChangeManipulator(object_id) except ObjectDoesNotExist: raise Http404 if request.POST: new_data = request.POST.copy() errors = manipulator.get_validation_errors(new_data) if not errors: manipulator.do_html2python(new_data) # '''WRONG!!''' manipulator.save(new_data) return HttpResponseRedirect("") else: # Populate new_data with a "flattened" version of the current data. new_data = manipulator.original_object.__dict__ # '''WRONG!!''' errors = {} mash_around_with_the_data_dict_to_make_foreign_keys_work(new_data) # '''WRONG!!''' # Populate the FormWrapper. form = formfields.FormWrapper(manipulator, new_data, errors) return render_to_response('style_edit', { 'form': form })
To:
def style_edit(request, object_id): try: manipulator = styles.ChangeManipulator(object_id) except ObjectDoesNotExist: raise Http404 if request.POST: new_data = request.POST.copy() errors = manipulator.get_validation_errors(new_data) manipulator.do_html2python(new_data) # '''CORRECT!!''' if not errors: manipulator.save(new_data) return HttpResponseRedirect("") else: # Populate new_data with a "flattened" version of the current data. new_data = manipulator.flatten_data() # '''CORRECT!!''' errors = {} # Populate the FormWrapper. form = formfields.FormWrapper(manipulator, new_data, errors) return render_to_response('style_edit', { 'form': form })
Without these changes, the new fixes will not work. It should work about as well as the trunk without these changes.
So,
- Make sure html2python is called regardless of whether there are errors, but *after* validation.
- Make sure you use flatten_data to get your new_data to fill in your forms, NOT just the dict of the object you are editing. Otherwise, dates, foreign keys, inline editing and a whole host of other things will NOT work properly, just like they do not work on trunk.
- Make sure you remove any hacks for modifying the data in your view function. This is now done by the fields themselves in flatten_data and instances where it works unexpectedly should be filed as bugs.
Manipulators ¶
Manipulators have a new optional argument to their constructors: follow
. The argument is a dictionary indicating which fields and related objects to extract in flatten_data and examine when saving the object.
The default set to follow is:
- Any fields without
editable=False
. - Any related objects with
edit_inline
set on theForeignKey
relating to the class the manipulator is concerned with.
This is the set of fields shown by the admin.
(insert example)
Manipulators have a new method, flatten_data()
. This takes the data from the existing object (or the defaults in the case of an AddManipulator
) and turns it into a suitable form for an HTTP post. It must be called before creating the formfield wrapper is created.
The data from a post must have manipulator.do_html2python(new_data)
called on it before it is used to repopulate a formfieldwrapper.
Templates ¶
A new tag, called include
, which is an improvement on ssi parsed. See #598.
Improved error reporting when debug is on. See #603. Also note that loaders must return a tuple of (source, filename) rather than just the source of a loaded template.
Admin converted to separate templates ¶
The admin is now rendered using separate templates. These can be overloaded, meaning the admin is a bit easily customizable. Inline editing can use a custom template, reather than using edit_inline=meta.TABULAR or meta.SOURCE, just use a path to a template, eg edit_inline="edit_inline_horizontal".
This does require knowing the contents of the context for that template which is undocumented. Also this will probably change to a class to allow more flexibility, eg processing for style/grouping logic etc.