1
0
mirror of https://github.com/django/django.git synced 2025-10-26 15:16:09 +00:00

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.

git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@4372 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty
2007-01-20 21:16:31 +00:00
parent 23b628d731
commit 9c5e28e1e8
4 changed files with 121 additions and 126 deletions

View File

@@ -1,4 +1,5 @@
from django import oldforms, template
from django import newforms as forms
from django.core.exceptions import ImproperlyConfigured, PermissionDenied
from django.db import models
from django.http import Http404, HttpResponse, HttpResponseRedirect
@@ -67,13 +68,63 @@ class AdminFieldLine(object):
def __len__(self):
return len(self.fields)
# New implementation of Fieldset
class AdminForm(object):
def __init__(self, form, fieldsets):
self.form, self.fieldsets = form, fieldsets
def __iter__(self):
for fieldset in self.fieldsets:
yield BoundFieldset(self.form, fieldset)
class Fieldset(object):
def __init__(self, name=None, fields=(), classes=(), description=None):
self.name, self.fields = name, fields
self.classes = ' '.join(classes)
self.description = description
class BoundFieldset(object):
def __init__(self, form, fieldset):
self.form, self.fieldset = form, fieldset
def __iter__(self):
for field in self.fieldset.fields:
yield BoundFieldline(self.form, field)
class BoundFieldline(object):
def __init__(self, form, field):
self.form = form # A django.forms.Form instance
if isinstance(field, basestring):
self.fields = [field]
else:
self.fields = field
def __iter__(self):
for i, field in enumerate(self.fields):
yield BoundField(self.form, field, is_first=(i == 0))
def errors(self):
return u'\n'.join([self.form[f].errors.as_ul() for f in self.fields])
class BoundField(object):
def __init__(self, form, field, is_first):
self.field = form[field] # A django.forms.BoundField instance
self.is_first = is_first # Whether this field is first on the line
self.is_checkbox = isinstance(self.field.field.widget, forms.CheckboxInput)
def label_tag(self):
classes = []
if self.is_checkbox:
classes.append('vCheckboxLabel')
contents = escape(self.field.label)
else:
contents = escape(self.field.label) + ':'
if self.field.field.required:
classes.append('required')
if not self.is_first:
classes.append('inline')
attrs = classes and {'class': ' '.join(classes)} or {}
return self.field.label_tag(contents=contents, attrs=attrs)
class ModelAdmin(object):
"Encapsulates all admin options and functionality for a given model."
@@ -202,18 +253,16 @@ class ModelAdmin(object):
# Object list will give 'Permission Denied', so go back to admin home
post_url = '../../../'
manipulator = model.AddManipulator()
ModelForm = forms.form_for_model(model)
if request.POST:
new_data = request.POST.copy()
if opts.has_field_type(models.FileField):
new_data.update(request.FILES)
form = ModelForm(new_data)
errors = manipulator.get_validation_errors(new_data)
manipulator.do_html2python(new_data)
if not errors:
new_object = manipulator.save(new_data)
if form.is_valid():
new_object = form.save(commit=True)
pk_value = new_object._get_pk_val()
LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), ADDITION)
msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': opts.verbose_name, 'obj': new_object}
@@ -236,25 +285,17 @@ class ModelAdmin(object):
request.user.message_set.create(message=msg)
return HttpResponseRedirect(post_url)
else:
# Add default data.
new_data = manipulator.flatten_data()
# Override the defaults with GET params, if they exist.
new_data.update(dict(request.GET.items()))
errors = {}
# Populate the FormWrapper.
form = oldforms.FormWrapper(manipulator, new_data, errors)
form = ModelForm(initial=request.GET)
c = template.RequestContext(request, {
'title': _('Add %s') % opts.verbose_name,
'oldform': form,
'adminform': AdminForm(form, self.fieldsets_add(request)),
'oldform': oldforms.FormWrapper(model.AddManipulator(), {}, {}),
'is_popup': request.REQUEST.has_key('_popup'),
'show_delete': False,
})
return render_change_form(self, model, manipulator, c, add=True)
return render_change_form(self, model, model.AddManipulator(), c, add=True)
def change_view(self, request, object_id):
"The 'change' admin view for this model."
@@ -272,32 +313,33 @@ class ModelAdmin(object):
return self.add_view(request, form_url='../../add/')
try:
manipulator = model.ChangeManipulator(object_id)
obj = model._default_manager.get(pk=object_id)
except model.DoesNotExist:
raise Http404('%s object with primary key %r does not exist' % (model_name, escape(object_id)))
ModelForm = forms.form_for_instance(obj)
if request.POST:
new_data = request.POST.copy()
if opts.has_field_type(models.FileField):
new_data.update(request.FILES)
form = ModelForm(new_data)
errors = manipulator.get_validation_errors(new_data)
manipulator.do_html2python(new_data)
if not errors:
new_object = manipulator.save(new_data)
if form.is_valid():
new_object = form.save(commit=True)
pk_value = new_object._get_pk_val()
# Construct the change message.
# Construct the change message. TODO: Temporarily commented-out,
# as manipulator object doesn't exist anymore, and we don't yet
# have a way to get fields_added, fields_changed, fields_deleted.
change_message = []
if manipulator.fields_added:
change_message.append(_('Added %s.') % get_text_list(manipulator.fields_added, _('and')))
if manipulator.fields_changed:
change_message.append(_('Changed %s.') % get_text_list(manipulator.fields_changed, _('and')))
if manipulator.fields_deleted:
change_message.append(_('Deleted %s.') % get_text_list(manipulator.fields_deleted, _('and')))
change_message = ' '.join(change_message)
#if manipulator.fields_added:
#change_message.append(_('Added %s.') % get_text_list(manipulator.fields_added, _('and')))
#if manipulator.fields_changed:
#change_message.append(_('Changed %s.') % get_text_list(manipulator.fields_changed, _('and')))
#if manipulator.fields_deleted:
#change_message.append(_('Deleted %s.') % get_text_list(manipulator.fields_deleted, _('and')))
#change_message = ' '.join(change_message)
if not change_message:
change_message = _('No fields changed.')
LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), CHANGE, change_message)
@@ -319,41 +361,31 @@ class ModelAdmin(object):
request.user.message_set.create(message=msg)
return HttpResponseRedirect("../")
else:
# Populate new_data with a "flattened" version of the current data.
new_data = manipulator.flatten_data()
form = ModelForm()
# TODO: do this in flatten_data...
# If the object has ordered objects on its admin page, get the existing
# order and flatten it into a comma-separated list of IDs.
id_order_list = []
for rel_obj in opts.get_ordered_objects():
id_order_list.extend(getattr(manipulator.original_object, 'get_%s_order' % rel_obj.object_name.lower())())
if id_order_list:
new_data['order_'] = ','.join(map(str, id_order_list))
errors = {}
## Populate the FormWrapper.
#oldform = oldforms.FormWrapper(manipulator, new_data, errors)
#oldform.original = manipulator.original_object
#oldform.order_objects = []
# Populate the FormWrapper.
form = oldforms.FormWrapper(manipulator, new_data, errors)
form.original = manipulator.original_object
form.order_objects = []
# TODO: Should be done in flatten_data / FormWrapper construction
for related in opts.get_followed_related_objects():
wrt = related.opts.order_with_respect_to
if wrt and wrt.rel and wrt.rel.to == opts:
func = getattr(manipulator.original_object, 'get_%s_list' %
related.get_accessor_name())
orig_list = func()
form.order_objects.extend(orig_list)
## TODO: Should be done in flatten_data / FormWrapper construction
#for related in opts.get_followed_related_objects():
#wrt = related.opts.order_with_respect_to
#if wrt and wrt.rel and wrt.rel.to == opts:
#func = getattr(manipulator.original_object, 'get_%s_list' %
#related.get_accessor_name())
#orig_list = func()
#oldform.order_objects.extend(orig_list)
c = template.RequestContext(request, {
'title': _('Change %s') % opts.verbose_name,
'oldform': form,
'adminform': AdminForm(form, self.fieldsets_change(request, object_id)),
'oldform': oldforms.FormWrapper(model.ChangeManipulator(object_id), {}, {}),
'object_id': object_id,
'original': manipulator.original_object,
'original': obj,
'is_popup': request.REQUEST.has_key('_popup'),
})
return render_change_form(self, model, manipulator, c, change=True)
return render_change_form(self, model, model.ChangeManipulator(object_id), c, change=True)
def changelist_view(self, request):
"The 'change list' admin view for this model."