1
0
mirror of https://github.com/django/django.git synced 2025-07-04 17:59:13 +00:00

Cleanups of whitespace changes and errors after big merge

git-svn-id: http://code.djangoproject.com/svn/django/branches/new-admin@981 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Robert Wittams 2005-10-20 15:55:45 +00:00
parent b0ad6b878e
commit 5d74e282a4
12 changed files with 39 additions and 143 deletions

View File

@ -1,59 +0,0 @@
from django.conf.urls.defaults import *
from django.conf.settings import INSTALLED_APPS
urlpatterns = (
('^$', 'django.contrib.admin.views.main.index'),
('^logout/$', 'django.views.auth.login.logout'),
('^password_change/$', 'django.views.registration.passwords.password_change'),
('^password_change/done/$', 'django.views.registration.passwords.password_change_done'),
('^template_validator/$', 'django.contrib.admin.views.template.template_validator'),
# Documentation
('^doc/$', 'django.contrib.admin.views.doc.doc_index'),
('^doc/bookmarklets/$', 'django.contrib.admin.views.doc.bookmarklets'),
('^doc/tags/$', 'django.contrib.admin.views.doc.template_tag_index'),
('^doc/filters/$', 'django.contrib.admin.views.doc.template_filter_index'),
('^doc/views/$', 'django.contrib.admin.views.doc.view_index'),
('^doc/views/jump/$', 'django.contrib.admin.views.doc.jump_to_view'),
('^doc/views/(?P<view>[^/]+)/$', 'django.contrib.admin.views.doc.view_detail'),
('^doc/models/$', 'django.contrib.admin.views.doc.model_index'),
('^doc/models/(?P<model>[^/]+)/$', 'django.contrib.admin.views.doc.model_detail'),
# ('^doc/templates/$', 'django.views.admin.doc.template_index'),
('^doc/templates/(?P<template>.*)/$', 'django.contrib.admin.views.doc.template_detail'),
)
if 'ellington.events' in INSTALLED_APPS:
urlpatterns += (
("^events/usersubmittedevents/(?P<object_id>\d+)/$", 'ellington.events.views.admin.user_submitted_event_change_stage'),
("^events/usersubmittedevents/(?P<object_id>\d+)/delete/$", 'ellington.events.views.admin.user_submitted_event_delete_stage'),
)
if 'ellington.news' in INSTALLED_APPS:
urlpatterns += (
("^stories/preview/$", 'ellington.news.views.admin.story_preview'),
("^stories/js/inlinecontrols/$", 'ellington.news.views.admin.inlinecontrols_js'),
("^stories/js/inlinecontrols/(?P<label>[-\w]+)/$", 'ellington.news.views.admin.inlinecontrols_js_specific'),
)
if 'ellington.alerts' in INSTALLED_APPS:
urlpatterns += (
("^alerts/send/$", 'ellington.alerts.views.admin.send_alert_form'),
("^alerts/send/do/$", 'ellington.alerts.views.admin.send_alert_action'),
)
if 'ellington.media' in INSTALLED_APPS:
urlpatterns += (
('^media/photos/caption/(?P<photo_id>\d+)/$', 'ellington.media.views.admin.get_exif_caption'),
)
urlpatterns += (
# Metasystem admin pages
('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/add_old/$', 'django.contrib.admin.views.main.add_stage'),
('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/(?P<object_id>.+)_old/$', 'django.contrib.admin.views.main.change_stage'),
('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/$', 'django.contrib.admin.views.main.change_list'),
('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/add/$', 'django.contrib.admin.views.main.add_stage_new'),
('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/(?P<object_id>.+)/history/$', 'django.contrib.admin.views.main.history'),
('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/(?P<object_id>.+)/delete/$', 'django.contrib.admin.views.main.delete_stage'),
('^(?P<app_label>[^/]+)/(?P<module_name>[^/]+)/(?P<object_id>.+)/$', 'django.contrib.admin.views.main.change_stage_new'),
)
urlpatterns = patterns('', *urlpatterns)

View File

@ -927,7 +927,7 @@ def delete_stage(request, app_label, module_name, object_id):
log.log_action(request.user.id, opts.get_content_type_id(), object_id, obj_repr, log.DELETION) log.log_action(request.user.id, opts.get_content_type_id(), object_id, obj_repr, log.DELETION)
request.user.add_message('The %s "%s" was deleted successfully.' % (opts.verbose_name, obj_repr)) request.user.add_message('The %s "%s" was deleted successfully.' % (opts.verbose_name, obj_repr))
return HttpResponseRedirect("../../") return HttpResponseRedirect("../../")
return render_to_response('admin/delete_confirmation_generic', { return render_to_response('admin/delete_confirmation', {
"title": "Are you sure?", "title": "Are you sure?",
"object_name": opts.verbose_name, "object_name": opts.verbose_name,
"object": obj, "object": obj,

View File

@ -23,7 +23,7 @@ def template_validator(request):
errors = manipulator.get_validation_errors(new_data) errors = manipulator.get_validation_errors(new_data)
if not errors: if not errors:
request.user.add_message('The template is valid.') request.user.add_message('The template is valid.')
return render_to_response('template_validator', { return render_to_response('admin/template_validator', {
'title': 'Template validator', 'title': 'Template validator',
'form': formfields.FormWrapper(manipulator, new_data, errors), 'form': formfields.FormWrapper(manipulator, new_data, errors),
}, context_instance=DjangoContext(request)) }, context_instance=DjangoContext(request))

View File

@ -244,7 +244,6 @@ class InlineObjectCollection:
field = self.parent_manipulator[full_field_name] field = self.parent_manipulator[full_field_name]
data = field.extract_data(self.data) data = field.extract_data(self.data)
errors = self.errors.get(full_field_name, []) errors = self.errors.get(full_field_name, [])
# if(errors):raise full_field_name + " " + repr(errors)
collection[field_name] = FormFieldWrapper(field, data, errors) collection[field_name] = FormFieldWrapper(field, data, errors)
wrapper.append(FormFieldCollection(collection)) wrapper.append(FormFieldCollection(collection))
self._collections = wrapper self._collections = wrapper
@ -288,27 +287,24 @@ class FormField:
return self.field_name return self.field_name
def extract_data(self, data_dict): def extract_data(self, data_dict):
if hasattr(self, 'requires_data_list') and hasattr(data_dict, 'getlist'): if hasattr(self, 'requires_data_list') and hasattr(data_dict, 'getlist'):
data = data_dict.getlist(self.get_member_name()) data = data_dict.getlist(self.get_member_name())
else: else:
data = data_dict.get(self.get_member_name(), None) data = data_dict.get(self.get_member_name(), None)
if data is None: if data is None:
data = '' data = ''
self.data_dict = data_dict return data
return data
def convert_post_data(self, new_data): def convert_post_data(self, new_data):
name = self.get_member_name() name = self.get_member_name()
if new_data.has_key(self.field_name): if new_data.has_key(self.field_name):
d = new_data.getlist(self.field_name) d = new_data.getlist(self.field_name)
#del new_data[self.field_name]
try: try:
converted_data = [self.__class__.html2python(data) converted_data = [self.__class__.html2python(data)
for data in d] for data in d]
except ValueError: except ValueError:
converted_data = d converted_data = d
new_data.setlist(name, converted_data) new_data.setlist(name, converted_data)
else: else:
try: try:
# individual fields deal with None values themselves # individual fields deal with None values themselves

View File

@ -633,7 +633,6 @@ def runserver(addr, port):
sys.exit(0) sys.exit(0)
from django.utils import autoreload from django.utils import autoreload
autoreload.main(inner_run) autoreload.main(inner_run)
#inner_run()
runserver.args = '[optional port number, or ipaddr:port]' runserver.args = '[optional port number, or ipaddr:port]'
def createcachetable(tablename): def createcachetable(tablename):

View File

@ -924,8 +924,8 @@ def method_save(opts, self):
# If it does already exist, do an UPDATE. # If it does already exist, do an UPDATE.
if cursor.fetchone(): if cursor.fetchone():
db_values = [f.get_db_prep_save(f.pre_save(getattr(self, f.column), False)) for f in non_pks] db_values = [f.get_db_prep_save(f.pre_save(getattr(self, f.column), False)) for f in non_pks]
cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % (opts.db_table, cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % (opts.db_table,
','.join(['%s=%%s' % f.column for f in non_pks]), opts.pk.column), ','.join(['%s=%%s' % f.column for f in non_pks]), opts.pk.column),
db_values + [pk_val]) db_values + [pk_val])
else: else:
record_exists = False record_exists = False
@ -1580,7 +1580,6 @@ def manipulator_init(opts, add, change, self, obj_key=None, follow=None):
for f in opts.fields + opts.many_to_many: for f in opts.fields + opts.many_to_many:
if self.follow.get(f.name, False): if self.follow.get(f.name, False):
# if f.editable and not (f.primary_key and change) and (not f.rel or not f.rel.edit_inline):
self.fields.extend(f.get_manipulator_fields(opts, self, change)) self.fields.extend(f.get_manipulator_fields(opts, self, change))
# Add fields for related objects. # Add fields for related objects.
@ -1589,21 +1588,6 @@ def manipulator_init(opts, add, change, self, obj_key=None, follow=None):
fol = self.follow[f.name] fol = self.follow[f.name]
self.fields.extend(f.get_manipulator_fields(opts, self, change, fol)) self.fields.extend(f.get_manipulator_fields(opts, self, change, fol))
# for obj in opts.get_inline_related_objects_wrapped():
# if change:
# count = getattr(self.original_object, 'get_%s_count' % opts.get_rel_object_method_name(obj.opts, obj.field))()
# count += obj.field.rel.num_extra_on_change
# if obj.field.rel.min_num_in_admin:
# count = max(count, obj.field.rel.min_num_in_admin)
# if obj.field.rel.max_num_in_admin:
# count = min(count, obj.field.rel.max_num_in_admin)
# else:
# count = obj.field.rel.num_in_admin
# for f in obj.opts.fields + obj.opts.many_to_many:
# if f.editable and f != obj.field :
# for i in range(count):
# self.fields.extend(f.get_manipulator_fields(obj.opts, self, change, name_prefix='%s.%d.' % (obj.opts.object_name.lower(), i), rel=True))
# Add field for ordering. # Add field for ordering.
if change and opts.get_ordered_objects(): if change and opts.get_ordered_objects():
self.fields.append(formfields.CommaSeparatedIntegerField(field_name="order_")) self.fields.append(formfields.CommaSeparatedIntegerField(field_name="order_"))
@ -1612,7 +1596,8 @@ def manipulator_save(opts, klass, add, change, self, new_data):
# TODO: big cleanup when core fields go -> use recursive manipulators. # TODO: big cleanup when core fields go -> use recursive manipulators.
from django.utils.datastructures import DotExpandedDict from django.utils.datastructures import DotExpandedDict
params = {} params = {}
for f in opts.fields: for f in opts.fields:
# Fields with auto_now_add should keep their original value in the change stage.
auto_now_add = change and getattr(f, 'auto_now_add', False) auto_now_add = change and getattr(f, 'auto_now_add', False)
if self.follow.get(f.name, None) and not auto_now_add: if self.follow.get(f.name, None) and not auto_now_add:
param = f.get_manipulator_new_data(new_data) param = f.get_manipulator_new_data(new_data)
@ -1623,12 +1608,6 @@ def manipulator_save(opts, klass, add, change, self, new_data):
param = f.get_default() param = f.get_default()
params[f.column] = param params[f.column] = param
# Fields with auto_now_add are another special case; they should keep
# their original value in the change stage.
#if change and getattr(f, 'auto_now_add', False):
# params[f.column] = getattr(self.original_object, f.name)
#else:
# params[f.column] = f.get_manipulator_new_data(new_data)
if change: if change:
params[opts.pk.column] = self.obj_key params[opts.pk.column] = self.obj_key

View File

@ -258,7 +258,6 @@ class Field(object):
val = None val = None
return val return val
def get_choices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH): def get_choices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH):
"Returns a list of tuples used as SelectField choices for this field." "Returns a list of tuples used as SelectField choices for this field."
@ -266,10 +265,7 @@ class Field(object):
if self.choices: if self.choices:
return first_choice + list(self.choices) return first_choice + list(self.choices)
rel_obj = self.rel.to rel_obj = self.rel.to
choices = first_choice + [(getattr(x, rel_obj.pk.column), repr(x)) for x in rel_obj.get_model_module().get_list(**self.rel.limit_choices_to)] return first_choice + [(getattr(x, rel_obj.pk.column), repr(x)) for x in rel_obj.get_model_module().get_list(**self.rel.limit_choices_to)]
return choices
def get_choices_default(self): def get_choices_default(self):
if(self.radio_admin): if(self.radio_admin):
@ -284,13 +280,12 @@ class Field(object):
return self.get_default() return self.get_default()
def flatten_data(self, follow, obj = None): def flatten_data(self, follow, obj = None):
""" """
Returns a dictionary mapping the field's manipulator field names to its Returns a dictionary mapping the field's manipulator field names to its
"flattened" string values for the admin view. Obj is the instance to extract the "flattened" string values for the admin view. Obj is the instance to extract the
values from. values from.
""" """
return { self.get_db_column(): self._get_val_from_obj(obj)}
return { self.get_db_column(): self._get_val_from_obj(obj)}
def get_follow(self, override=None): def get_follow(self, override=None):
if override != None: if override != None:
@ -306,7 +301,7 @@ class AutoField(Field):
def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False): def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False):
if not rel: if not rel:
return [] # Don't add a FormField unless it's in a related change context. return [] # Don't add a FormField unless it's in a related context.
return Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel) return Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel)
def get_manipulator_field_objs(self): def get_manipulator_field_objs(self):
@ -398,8 +393,8 @@ class DateTimeField(DateField):
def flatten_data(self,follow, obj = None): def flatten_data(self,follow, obj = None):
val = self._get_val_from_obj(obj) val = self._get_val_from_obj(obj)
date_field, time_field = self.get_manipulator_field_names('') date_field, time_field = self.get_manipulator_field_names('')
return {date_field: (val is not None and val.strftime("%Y-%m-%d") or ''), return {date_field: (val is not None and val.strftime("%Y-%m-%d") or ''),
time_field: (val is not None and val.strftime("%H:%M:%S") or '')} time_field: (val is not None and val.strftime("%H:%M:%S") or '')}
class EmailField(Field): class EmailField(Field):
def get_manipulator_field_objs(self): def get_manipulator_field_objs(self):
@ -594,7 +589,7 @@ class TimeField(Field):
def flatten_data(self,follow, obj = None): def flatten_data(self,follow, obj = None):
val = self._get_val_from_obj(obj) val = self._get_val_from_obj(obj)
return {self.get_db_column(): (val is not None and val.strftime("%H:%M:%S") or '')} return {self.get_db_column(): (val is not None and val.strftime("%H:%M:%S") or '')}
class URLField(Field): class URLField(Field):
def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs): def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
@ -908,8 +903,6 @@ class Admin:
returns a list of lists of name, dict returns a list of lists of name, dict
the dict has attribs 'fields' and maybe 'classes'. the dict has attribs 'fields' and maybe 'classes'.
fields is a list of subclasses of Field. fields is a list of subclasses of Field.
TODO:Return value needs to be encapsulated.
""" """
if self.fields is None: if self.fields is None:
field_struct = ((None, {'fields': [f.name for f in opts.fields + opts.many_to_many if f.editable and not isinstance(f, AutoField)]}),) field_struct = ((None, {'fields': [f.name for f in opts.fields + opts.many_to_many if f.editable and not isinstance(f, AutoField)]}),)

View File

@ -74,7 +74,7 @@ VARIABLE_TAG_END = '}}'
ALLOWED_VARIABLE_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.' ALLOWED_VARIABLE_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.'
#What to report as the origin of templates that come from non file sources (eg strings) #What to report as the origin of templates that come from non loader sources (ie strings)
UNKNOWN_SOURCE="<unknown source>" UNKNOWN_SOURCE="<unknown source>"
#match starts of lines #match starts of lines
@ -140,7 +140,6 @@ class Template:
def render(self, context): def render(self, context):
"Display stage -- can be called many times" "Display stage -- can be called many times"
return self.nodelist.render(context) return self.nodelist.render(context)
def compile_string(template_string, origin): def compile_string(template_string, origin):
"Compiles template_string into NodeList ready for rendering" "Compiles template_string into NodeList ready for rendering"
@ -225,6 +224,7 @@ class Lexer(object):
def tokenize(self): def tokenize(self):
"Return a list of tokens from a given template_string" "Return a list of tokens from a given template_string"
# remove all empty strings, because the regex has a tendency to add them
bits = filter(None, tag_re.split(self.template_string)) bits = filter(None, tag_re.split(self.template_string))
return map(self.create_token, bits) return map(self.create_token, bits)
@ -276,7 +276,7 @@ class DebugLexer(Lexer):
class Parser(object): class Parser(object):
def __init__(self, tokens): def __init__(self, tokens):
self.tokens = tokens self.tokens = tokens
def parse(self, parse_until=[]): def parse(self, parse_until=[]):
nodelist = self.create_nodelist() nodelist = self.create_nodelist()
while self.tokens: while self.tokens:
@ -296,26 +296,21 @@ class Parser(object):
command = token.contents.split()[0] command = token.contents.split()[0]
except IndexError: except IndexError:
self.empty_block_tag(token) self.empty_block_tag(token)
# execute callback function for this tag and append resulting node # execute callback function for this tag and append resulting node
self.enter_command(command, token); self.enter_command(command, token);
try: try:
compile_func = registered_tags[command] compile_func = registered_tags[command]
except KeyError: except KeyError:
self.invalid_block_tag(token, command) self.invalid_block_tag(token, command)
try: try:
compiled_result = compile_func(self, token) compiled_result = compile_func(self, token)
except TemplateSyntaxError, e: except TemplateSyntaxError, e:
if not self.compile_function_error(token, e): if not self.compile_function_error(token, e):
raise raise
self.extend_nodelist(nodelist, compiled_result, token) self.extend_nodelist(nodelist, compiled_result, token)
self.exit_command(); self.exit_command();
if parse_until: if parse_until:
self.unclosed_block_tag(token, parse_until) self.unclosed_block_tag(token, parse_until)
return nodelist return nodelist
def create_nodelist(self): def create_nodelist(self):

View File

@ -227,7 +227,6 @@ class SsiNode(Node):
return '' # Fail silently for invalid included templates. return '' # Fail silently for invalid included templates.
return output return output
class LoadNode(Node): class LoadNode(Node):
def __init__(self, taglib): def __init__(self, taglib):
self.taglib = taglib self.taglib = taglib

View File

@ -41,30 +41,24 @@ for path in TEMPLATE_LOADERS:
else: else:
template_source_loaders.append(func) template_source_loaders.append(func)
class LoaderOrigin(Origin): class LoaderOrigin(Origin):
def __init__(self, name, loader): def __init__(self, name, loader, name, dirs):
def reload():
return loader(name, dirs)[0]
super(LoaderOrigin, self).__init__(name) super(LoaderOrigin, self).__init__(name)
self.loader = loader self._reload = reload
def reload(self): def reload(self):
if self.loader: return self._reload()
return self.loader()
else:
raise NotImplementedException
def find_template_source(name, dirs=None): def find_template_source(name, dirs=None):
for loader in template_source_loaders: for loader in template_source_loaders:
try: try:
source, display_name = loader(name, dirs) source, display_name = loader(name, dirs)
def reload():
return loader(name, dirs)[0]
return (source, LoaderOrigin(display_name, reload))
return (source, LoaderOrigin(display_name, loader, name, dirs))
except TemplateDoesNotExist: except TemplateDoesNotExist:
pass pass
raise TemplateDoesNotExist, name raise TemplateDoesNotExist, name
@ -216,7 +210,6 @@ class IncludeNode(Node):
except Exception, e: except Exception, e:
return '' # Fail silently for invalid included templates. return '' # Fail silently for invalid included templates.
def do_block(parser, token): def do_block(parser, token):
""" """
Define a block that can be overridden by child templates. Define a block that can be overridden by child templates.

View File

@ -12,7 +12,7 @@ import re
_datere = r'\d{4}-((?:0?[1-9])|(?:1[0-2]))-((?:0?[1-9])|(?:[12][0-9])|(?:3[0-1]))' _datere = r'\d{4}-((?:0?[1-9])|(?:1[0-2]))-((?:0?[1-9])|(?:[12][0-9])|(?:3[0-1]))'
_timere = r'(?:[01]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?' _timere = r'(?:[01]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?'
alnum_re = re.compile(r'^[\w-]+$') alnum_re = re.compile(r'^\w+$')
alnumurl_re = re.compile(r'^[\w/]+$') alnumurl_re = re.compile(r'^[\w/]+$')
ansi_date_re = re.compile('^%s$' % _datere) ansi_date_re = re.compile('^%s$' % _datere)
ansi_time_re = re.compile('^%s$' % _timere) ansi_time_re = re.compile('^%s$' % _timere)
@ -54,7 +54,7 @@ class CriticalValidationError(Exception):
def isAlphaNumeric(field_data, all_data): def isAlphaNumeric(field_data, all_data):
if not alnum_re.search(field_data): if not alnum_re.search(field_data):
raise ValidationError, "This value must contain only letters, numbers, dashes and underscores." raise ValidationError, "This value must contain only letters, numbers and underscores."
def isAlphaNumericURL(field_data, all_data): def isAlphaNumericURL(field_data, all_data):
if not alnumurl_re.search(field_data): if not alnumurl_re.search(field_data):

View File

@ -9,7 +9,7 @@ from django.core.exceptions import Http404, ObjectDoesNotExist, ImproperlyConfig
def create_object(request, app_label, module_name, template_name=None, def create_object(request, app_label, module_name, template_name=None,
template_loader=template_loader, extra_context={}, template_loader=template_loader, extra_context={},
post_save_redirect=None, login_required=False): post_save_redirect=None, login_required=False, follow=None):
""" """
Generic object-creation function. Generic object-creation function.
@ -22,17 +22,17 @@ def create_object(request, app_label, module_name, template_name=None,
return redirect_to_login(request.path) return redirect_to_login(request.path)
mod = models.get_module(app_label, module_name) mod = models.get_module(app_label, module_name)
manipulator = mod.AddManipulator() manipulator = mod.AddManipulator(follow=follow)
if request.POST: if request.POST:
# If data was POSTed, we're trying to create a new object # If data was POSTed, we're trying to create a new object
new_data = request.POST.copy() new_data = request.POST.copy()
# Check for errors # Check for errors
errors = manipulator.get_validation_errors(new_data) errors = manipulator.get_validation_errors(new_data)
manipulator.do_html2python(new_data)
if not errors: if not errors:
# No errors -- this means we can save the data! # No errors -- this means we can save the data!
manipulator.do_html2python(new_data)
new_object = manipulator.save(new_data) new_object = manipulator.save(new_data)
if not request.user.is_anonymous(): if not request.user.is_anonymous():
@ -48,7 +48,8 @@ def create_object(request, app_label, module_name, template_name=None,
raise ImproperlyConfigured("No URL to redirect to from generic create view.") raise ImproperlyConfigured("No URL to redirect to from generic create view.")
else: else:
# No POST, so we want a brand new form without any data or errors # No POST, so we want a brand new form without any data or errors
errors = new_data = {} errors = {}
new_data = manipulator.flatten_data()
# Create the FormWrapper, template, context, response # Create the FormWrapper, template, context, response
form = formfields.FormWrapper(manipulator, new_data, errors) form = formfields.FormWrapper(manipulator, new_data, errors)