Changeset 4208
- Timestamp:
- 12/15/06 12:00:50 (2 years ago)
- Files:
-
- django/trunk/django/contrib/admin/views/auth.py (modified) (2 diffs)
- django/trunk/django/contrib/admin/views/main.py (modified) (3 diffs)
- django/trunk/django/contrib/admin/views/template.py (modified) (2 diffs)
- django/trunk/django/contrib/auth/forms.py (modified) (5 diffs)
- django/trunk/django/contrib/auth/views.py (modified) (4 diffs)
- django/trunk/django/contrib/comments/views/comments.py (modified) (5 diffs)
- django/trunk/django/db/models/fields/generic.py (modified) (2 diffs)
- django/trunk/django/db/models/fields/__init__.py (modified) (22 diffs)
- django/trunk/django/db/models/fields/related.py (modified) (5 diffs)
- django/trunk/django/db/models/manipulators.py (modified) (4 diffs)
- django/trunk/django/oldforms (copied) (copied from django/trunk/django/forms)
- django/trunk/django/views/generic/create_update.py (modified) (3 diffs)
- django/trunk/docs/forms.txt (modified) (2 diffs)
- django/trunk/docs/generic_views.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/contrib/admin/views/auth.py
r3925 r4208 3 3 from django.contrib.auth.models import User 4 4 from django.core.exceptions import PermissionDenied 5 from django import forms, template5 from django import oldforms, template 6 6 from django.shortcuts import render_to_response 7 7 from django.http import HttpResponseRedirect … … 25 25 else: 26 26 errors = new_data = {} 27 form = forms.FormWrapper(manipulator, new_data, errors)27 form = oldforms.FormWrapper(manipulator, new_data, errors) 28 28 return render_to_response('admin/auth/user/add_form.html', { 29 29 'title': _('Add user'), django/trunk/django/contrib/admin/views/main.py
r4181 r4208 1 from django import forms, template1 from django import oldforms, template 2 2 from django.conf import settings 3 3 from django.contrib.admin.filterspecs import FilterSpec … … 284 284 285 285 # Populate the FormWrapper. 286 form = forms.FormWrapper(manipulator, new_data, errors)286 form = oldforms.FormWrapper(manipulator, new_data, errors) 287 287 288 288 c = template.RequestContext(request, { … … 375 375 376 376 # Populate the FormWrapper. 377 form = forms.FormWrapper(manipulator, new_data, errors)377 form = oldforms.FormWrapper(manipulator, new_data, errors) 378 378 form.original = manipulator.original_object 379 379 form.order_objects = [] django/trunk/django/contrib/admin/views/template.py
r3951 r4208 1 1 from django.contrib.admin.views.decorators import staff_member_required 2 2 from django.core import validators 3 from django import template, forms3 from django import template, oldforms 4 4 from django.template import loader 5 5 from django.shortcuts import render_to_response … … 26 26 return render_to_response('admin/template_validator.html', { 27 27 'title': 'Template validator', 28 'form': forms.FormWrapper(manipulator, new_data, errors),28 'form': oldforms.FormWrapper(manipulator, new_data, errors), 29 29 }, context_instance=template.RequestContext(request)) 30 30 template_validator = staff_member_required(template_validator) 31 31 32 class TemplateValidator( forms.Manipulator):32 class TemplateValidator(oldforms.Manipulator): 33 33 def __init__(self, settings_modules): 34 34 self.settings_modules = settings_modules 35 35 site_list = Site.objects.in_bulk(settings_modules.keys()).values() 36 36 self.fields = ( 37 forms.SelectField('site', is_required=True, choices=[(s.id, s.name) for s in site_list]),38 forms.LargeTextField('template', is_required=True, rows=25, validator_list=[self.isValidTemplate]),37 oldforms.SelectField('site', is_required=True, choices=[(s.id, s.name) for s in site_list]), 38 oldforms.LargeTextField('template', is_required=True, rows=25, validator_list=[self.isValidTemplate]), 39 39 ) 40 40 django/trunk/django/contrib/auth/forms.py
r3908 r4208 4 4 from django.template import Context, loader 5 5 from django.core import validators 6 from django import forms6 from django import oldforms 7 7 8 class UserCreationForm( forms.Manipulator):8 class UserCreationForm(oldforms.Manipulator): 9 9 "A form that creates a user, with no privileges, from the given username and password." 10 10 def __init__(self): 11 11 self.fields = ( 12 forms.TextField(field_name='username', length=30, maxlength=30, is_required=True,12 oldforms.TextField(field_name='username', length=30, maxlength=30, is_required=True, 13 13 validator_list=[validators.isAlphaNumeric, self.isValidUsername]), 14 forms.PasswordField(field_name='password1', length=30, maxlength=60, is_required=True),15 forms.PasswordField(field_name='password2', length=30, maxlength=60, is_required=True,14 oldforms.PasswordField(field_name='password1', length=30, maxlength=60, is_required=True), 15 oldforms.PasswordField(field_name='password2', length=30, maxlength=60, is_required=True, 16 16 validator_list=[validators.AlwaysMatchesOtherField('password1', _("The two password fields didn't match."))]), 17 17 ) … … 28 28 return User.objects.create_user(new_data['username'], '', new_data['password1']) 29 29 30 class AuthenticationForm( forms.Manipulator):30 class AuthenticationForm(oldforms.Manipulator): 31 31 """ 32 32 Base class for authenticating users. Extend this to get a form that accepts … … 42 42 self.request = request 43 43 self.fields = [ 44 forms.TextField(field_name="username", length=15, maxlength=30, is_required=True,44 oldforms.TextField(field_name="username", length=15, maxlength=30, is_required=True, 45 45 validator_list=[self.isValidUser, self.hasCookiesEnabled]), 46 forms.PasswordField(field_name="password", length=15, maxlength=30, is_required=True),46 oldforms.PasswordField(field_name="password", length=15, maxlength=30, is_required=True), 47 47 ] 48 48 self.user_cache = None … … 69 69 return self.user_cache 70 70 71 class PasswordResetForm( forms.Manipulator):71 class PasswordResetForm(oldforms.Manipulator): 72 72 "A form that lets a user request a password reset" 73 73 def __init__(self): 74 74 self.fields = ( 75 forms.EmailField(field_name="email", length=40, is_required=True,75 oldforms.EmailField(field_name="email", length=40, is_required=True, 76 76 validator_list=[self.isValidUserEmail]), 77 77 ) … … 106 106 send_mail('Password reset on %s' % site_name, t.render(Context(c)), None, [self.user_cache.email]) 107 107 108 class PasswordChangeForm( forms.Manipulator):108 class PasswordChangeForm(oldforms.Manipulator): 109 109 "A form that lets a user change his password." 110 110 def __init__(self, user): 111 111 self.user = user 112 112 self.fields = ( 113 forms.PasswordField(field_name="old_password", length=30, maxlength=30, is_required=True,113 oldforms.PasswordField(field_name="old_password", length=30, maxlength=30, is_required=True, 114 114 validator_list=[self.isValidOldPassword]), 115 forms.PasswordField(field_name="new_password1", length=30, maxlength=30, is_required=True,115 oldforms.PasswordField(field_name="new_password1", length=30, maxlength=30, is_required=True, 116 116 validator_list=[validators.AlwaysMatchesOtherField('new_password2', _("The two 'new password' fields didn't match."))]), 117 forms.PasswordField(field_name="new_password2", length=30, maxlength=30, is_required=True),117 oldforms.PasswordField(field_name="new_password2", length=30, maxlength=30, is_required=True), 118 118 ) 119 119 django/trunk/django/contrib/auth/views.py
r3462 r4208 1 1 from django.contrib.auth.forms import AuthenticationForm 2 2 from django.contrib.auth.forms import PasswordResetForm, PasswordChangeForm 3 from django import forms3 from django import oldforms 4 4 from django.shortcuts import render_to_response 5 5 from django.template import RequestContext … … 27 27 request.session.set_test_cookie() 28 28 return render_to_response(template_name, { 29 'form': forms.FormWrapper(manipulator, request.POST, errors),29 'form': oldforms.FormWrapper(manipulator, request.POST, errors), 30 30 REDIRECT_FIELD_NAME: redirect_to, 31 31 'site_name': Site.objects.get_current().name, … … 63 63 form.save(email_template_name=email_template_name) 64 64 return HttpResponseRedirect('%sdone/' % request.path) 65 return render_to_response(template_name, {'form': forms.FormWrapper(form, new_data, errors)},65 return render_to_response(template_name, {'form': oldforms.FormWrapper(form, new_data, errors)}, 66 66 context_instance=RequestContext(request)) 67 67 … … 78 78 form.save(new_data) 79 79 return HttpResponseRedirect('%sdone/' % request.path) 80 return render_to_response(template_name, {'form': forms.FormWrapper(form, new_data, errors)},80 return render_to_response(template_name, {'form': oldforms.FormWrapper(form, new_data, errors)}, 81 81 context_instance=RequestContext(request)) 82 82 password_change = login_required(password_change) django/trunk/django/contrib/comments/views/comments.py
r3936 r4208 1 1 from django.core import validators 2 from django import forms2 from django import oldforms 3 3 from django.core.mail import mail_admins, mail_managers 4 4 from django.http import Http404 … … 29 29 return [] 30 30 self.fields.extend([ 31 forms.LargeTextField(field_name="comment", maxlength=3000, is_required=True,31 oldforms.LargeTextField(field_name="comment", maxlength=3000, is_required=True, 32 32 validator_list=[self.hasNoProfanities]), 33 forms.RadioSelectField(field_name="rating1", choices=choices,33 oldforms.RadioSelectField(field_name="rating1", choices=choices, 34 34 is_required=ratings_required and num_rating_choices > 0, 35 35 validator_list=get_validator_list(1), 36 36 ), 37 forms.RadioSelectField(field_name="rating2", choices=choices,37 oldforms.RadioSelectField(field_name="rating2", choices=choices, 38 38 is_required=ratings_required and num_rating_choices > 1, 39 39 validator_list=get_validator_list(2), 40 40 ), 41 forms.RadioSelectField(field_name="rating3", choices=choices,41 oldforms.RadioSelectField(field_name="rating3", choices=choices, 42 42 is_required=ratings_required and num_rating_choices > 2, 43 43 validator_list=get_validator_list(3), 44 44 ), 45 forms.RadioSelectField(field_name="rating4", choices=choices,45 oldforms.RadioSelectField(field_name="rating4", choices=choices, 46 46 is_required=ratings_required and num_rating_choices > 3, 47 47 validator_list=get_validator_list(4), 48 48 ), 49 forms.RadioSelectField(field_name="rating5", choices=choices,49 oldforms.RadioSelectField(field_name="rating5", choices=choices, 50 50 is_required=ratings_required and num_rating_choices > 4, 51 51 validator_list=get_validator_list(5), 52 52 ), 53 forms.RadioSelectField(field_name="rating6", choices=choices,53 oldforms.RadioSelectField(field_name="rating6", choices=choices, 54 54 is_required=ratings_required and num_rating_choices > 5, 55 55 validator_list=get_validator_list(6), 56 56 ), 57 forms.RadioSelectField(field_name="rating7", choices=choices,57 oldforms.RadioSelectField(field_name="rating7", choices=choices, 58 58 is_required=ratings_required and num_rating_choices > 6, 59 59 validator_list=get_validator_list(7), 60 60 ), 61 forms.RadioSelectField(field_name="rating8", choices=choices,61 oldforms.RadioSelectField(field_name="rating8", choices=choices, 62 62 is_required=ratings_required and num_rating_choices > 7, 63 63 validator_list=get_validator_list(8), … … 118 118 return c 119 119 120 class PublicFreeCommentManipulator( forms.Manipulator):120 class PublicFreeCommentManipulator(oldforms.Manipulator): 121 121 "Manipulator that handles public free (unregistered) comments" 122 122 def __init__(self): 123 123 self.fields = ( 124 forms.TextField(field_name="person_name", maxlength=50, is_required=True,124 oldforms.TextField(field_name="person_name", maxlength=50, is_required=True, 125 125 validator_list=[self.hasNoProfanities]), 126 forms.LargeTextField(field_name="comment", maxlength=3000, is_required=True,126 oldforms.LargeTextField(field_name="comment", maxlength=3000, is_required=True, 127 127 validator_list=[self.hasNoProfanities]), 128 128 ) … … 222 222 login(request, manipulator.get_user()) 223 223 if errors or request.POST.has_key('preview'): 224 class CommentFormWrapper( forms.FormWrapper):224 class CommentFormWrapper(oldforms.FormWrapper): 225 225 def __init__(self, manipulator, new_data, errors, rating_choices): 226 forms.FormWrapper.__init__(self, manipulator, new_data, errors)226 oldforms.FormWrapper.__init__(self, manipulator, new_data, errors) 227 227 self.rating_choices = rating_choices 228 228 def ratings(self): … … 303 303 return render_to_response('comments/free_preview.html', { 304 304 'comment': comment, 305 'comment_form': forms.FormWrapper(manipulator, new_data, errors),305 'comment_form': oldforms.FormWrapper(manipulator, new_data, errors), 306 306 'options': options, 307 307 'target': target, django/trunk/django/db/models/fields/generic.py
r3787 r4208 3 3 """ 4 4 5 from django import forms5 from django import oldforms 6 6 from django.core.exceptions import ObjectDoesNotExist 7 7 from django.db import backend … … 99 99 def get_manipulator_field_objs(self): 100 100 choices = self.get_choices_default() 101 return [curry( forms.SelectMultipleField, size=min(max(len(choices), 5), 15), choices=choices)]101 return [curry(oldforms.SelectMultipleField, size=min(max(len(choices), 5), 15), choices=choices)] 102 102 103 103 def get_choices_default(self): django/trunk/django/db/models/fields/__init__.py
r4205 r4208 3 3 from django.conf import settings 4 4 from django.core import validators 5 from django import forms5 from django import oldforms 6 6 from django.core.exceptions import ObjectDoesNotExist 7 7 from django.utils.functional import curry … … 207 207 if self.choices: 208 208 if self.radio_admin: 209 field_objs = [ forms.RadioSelectField]209 field_objs = [oldforms.RadioSelectField] 210 210 params['ul_class'] = get_ul_class(self.radio_admin) 211 211 else: 212 field_objs = [ forms.SelectField]212 field_objs = [oldforms.SelectField] 213 213 214 214 params['choices'] = self.get_choices_default() … … 219 219 def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True): 220 220 """ 221 Returns a list of forms.FormField instances for this field. It221 Returns a list of oldforms.FormField instances for this field. It 222 222 calculates the choices at runtime, not at compile time. 223 223 … … 361 361 362 362 def get_manipulator_field_objs(self): 363 return [ forms.HiddenField]363 return [oldforms.HiddenField] 364 364 365 365 def get_manipulator_new_data(self, new_data, rel=False): … … 388 388 389 389 def get_manipulator_field_objs(self): 390 return [ forms.CheckboxField]390 return [oldforms.CheckboxField] 391 391 392 392 class CharField(Field): 393 393 def get_manipulator_field_objs(self): 394 return [ forms.TextField]394 return [oldforms.TextField] 395 395 396 396 def to_python(self, value): … … 407 407 class CommaSeparatedIntegerField(CharField): 408 408 def get_manipulator_field_objs(self): 409 return [ forms.CommaSeparatedIntegerField]409 return [oldforms.CommaSeparatedIntegerField] 410 410 411 411 class DateField(Field): … … 469 469 470 470 def get_manipulator_field_objs(self): 471 return [ forms.DateField]471 return [oldforms.DateField] 472 472 473 473 def flatten_data(self, follow, obj = None): … … 510 510 511 511 def get_manipulator_field_objs(self): 512 return [ forms.DateField,forms.TimeField]512 return [oldforms.DateField, oldforms.TimeField] 513 513 514 514 def get_manipulator_field_names(self, name_prefix): … … 542 542 543 543 def get_manipulator_field_objs(self): 544 return [ forms.EmailField]544 return [oldforms.EmailField] 545 545 546 546 def validate(self, field_data, all_data): … … 606 606 607 607 def get_manipulator_field_objs(self): 608 return [ forms.FileUploadField,forms.HiddenField]608 return [oldforms.FileUploadField, oldforms.HiddenField] 609 609 610 610 def get_manipulator_field_names(self, name_prefix): … … 634 634 635 635 def get_manipulator_field_objs(self): 636 return [curry( forms.FilePathField, path=self.path, match=self.match, recursive=self.recursive)]636 return [curry(oldforms.FilePathField, path=self.path, match=self.match, recursive=self.recursive)] 637 637 638 638 class FloatField(Field): … … 643 643 644 644 def get_manipulator_field_objs(self): 645 return [curry( forms.FloatField, max_digits=self.max_digits, decimal_places=self.decimal_places)]645 return [curry(oldforms.FloatField, max_digits=self.max_digits, decimal_places=self.decimal_places)] 646 646 647 647 class ImageField(FileField): … … 651 651 652 652 def get_manipulator_field_objs(self): 653 return [ forms.ImageUploadField,forms.HiddenField]653 return [oldforms.ImageUploadField, oldforms.HiddenField] 654 654 655 655 def contribute_to_class(self, cls, name): … … 677 677 empty_strings_allowed = False 678 678 def get_manipulator_field_objs(self): 679 return [ forms.IntegerField]679 return [oldforms.IntegerField] 680 680 681 681 class IPAddressField(Field): … … 685 685 686 686 def get_manipulator_field_objs(self): 687 return [ forms.IPAddressField]687 return [oldforms.IPAddressField] 688 688 689 689 def validate(self, field_data, all_data): … … 696 696 697 697 def get_manipulator_field_objs(self): 698 return [ forms.NullBooleanField]698 return [oldforms.NullBooleanField] 699 699 700 700 class PhoneNumberField(IntegerField): 701 701 def get_manipulator_field_objs(self): 702 return [ forms.PhoneNumberField]702 return [oldforms.PhoneNumberField] 703 703 704 704 def validate(self, field_data, all_data): … … 707 707 class PositiveIntegerField(IntegerField): 708 708 def get_manipulator_field_objs(self): 709 return [ forms.PositiveIntegerField]709 return [oldforms.PositiveIntegerField] 710 710 711 711 class PositiveSmallIntegerField(IntegerField): 712 712 def get_manipulator_field_objs(self): 713 return [ forms.PositiveSmallIntegerField]713 return [oldforms.PositiveSmallIntegerField] 714 714 715 715 class SlugField(Field): … … 723 723 724 724 def get_manipulator_field_objs(self): 725 return [ forms.TextField]725 return [oldforms.TextField] 726 726 727 727 class SmallIntegerField(IntegerField): 728 728 def get_manipulator_field_objs(self): 729 return [ forms.SmallIntegerField]729 return [oldforms.SmallIntegerField] 730 730 731 731 class TextField(Field): 732 732 def get_manipulator_field_objs(self): 733 return [ forms.LargeTextField]733 return [oldforms.LargeTextField] 734 734 735 735 class TimeField(Field): … … 767 767 768 768 def get_manipulator_field_objs(self): 769 return [ forms.TimeField]769 return [oldforms.TimeField] 770 770 771 771 def flatten_data(self,follow, obj = None): … … 780 780 781 781 def get_manipulator_field_objs(self): 782 return [ forms.URLField]782 return [oldforms.URLField] 783 783 784 784 class USStateField(Field): 785 785 def get_manipulator_field_objs(self): 786 return [ forms.USStateField]786 return [oldforms.USStateField] 787 787 788 788 class XMLField(TextField): … … 795 795 796 796 def get_manipulator_field_objs(self): 797 return [curry( forms.XMLLargeTextField, schema_path=self.schema_path)]797 return [curry(oldforms.XMLLargeTextField, schema_path=self.schema_path)] 798 798 799 799 class OrderingField(IntegerField): … … 808 808 809 809 def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True): 810 return [ forms.HiddenField(name_prefix + self.name)]810 return [oldforms.HiddenField(name_prefix + self.name)] django/trunk/django/db/models/fields/related.py
r3926 r4208 6 6 from django.utils.functional import curry 7 7 from django.core import validators 8 from django import forms8 from django import oldforms 9 9 from django.dispatch import dispatcher 10 10 … … 494 494 else: 495 495 if self.radio_admin: 496 field_objs = [ forms.RadioSelectField]496 field_objs = [oldforms.RadioSelectField] 497 497 params['ul_class'] = get_ul_class(self.radio_admin) 498 498 else: 499 499 if self.null: 500 field_objs = [ forms.NullSelectField]500 field_objs = [oldforms.NullSelectField] 501 501 else: 502 field_objs = [ forms.SelectField]502 field_objs = [oldforms.SelectField] 503 503 params['choices'] = self.get_choices_default() 504 504 return field_objs, params … … 509 509 return rel_field.get_manipulator_field_objs() 510 510 else: 511 return [ forms.IntegerField]511 return [oldforms.IntegerField] 512 512 513 513 def get_db_prep_save(self, value): … … 582 582 else: 583 583 if self.radio_admin: 584 field_objs = [ forms.RadioSelectField]584 field_objs = [oldforms.RadioSelectField] 585 585 params['ul_class'] = get_ul_class(self.radio_admin) 586 586 else: 587 587 if self.null: 588 field_objs = [ forms.NullSelectField]588 field_objs = [oldforms.NullSelectField] 589 589 else: 590 field_objs = [ forms.SelectField]590 field_objs = [oldforms.SelectField] 591 591 params['choices'] = self.get_choices_default() 592 592 return field_objs, params … … 623 623 def get_manipulator_field_objs(self): 624 624 if self.rel.raw_id_admin: 625 return [ forms.RawIdAdminField]625 return [oldforms.RawIdAdminField] 626 626 else: 627 627 choices = self.get_choices_default() 628 return [curry( forms.SelectMultipleField, size=min(max(len(choices), 5), 15), choices=choices)]628 return [curry(oldforms.SelectMultipleField, size=min(max(len(choices), 5), 15), choices=choices)] 629 629 630 630 def get_choices_default(self): django/trunk/django/db/models/manipulators.py
r4028 r4208 1 1 from django.core.exceptions import ObjectDoesNotExist 2 from django import forms2 from django import oldforms 3 3 from django.core import validators 4 4 from django.db.models.fields import FileField, AutoField … … 41 41 return self.man 42 42 43 class AutomaticManipulator( forms.Manipulator):43 class AutomaticManipulator(oldforms.Manipulator): 44 44 def _prepare(cls, model): 45 45 cls.model = model … … 77 77 # Add field for ordering. 78 78 if self.change and self.opts.get_ordered_objects(): 79 self.fields.append( forms.CommaSeparatedIntegerField(field_name="order_"))79 self.fields.append(oldforms.CommaSeparatedIntegerField(field_name="order_")) 80 80 81 81 def save(self, new_data): … … 309 309 from django.db.models.fields.related import ManyToOneRel 310 310 date_str = all_data.get(date_field.get_manipulator_field_names('')[0], None) 311 date_val = forms.DateField.html2python(date_str)311 date_val = oldforms.DateField.html2python(date_str) 312 312 if date_val is None: 313 313 return # Date was invalid. This will be caught by another validator. django/trunk/django/views/generic/create_update.py
r3849 r4208 1 1 from django.core.xheaders import populate_xheaders 2 2 from django.template import loader 3 from django import forms3 from django import oldforms 4 4 from django.db.models import FileField 5 5 from django.contrib.auth.views import redirect_to_login … … 57 57 58 58 # Create the FormWrapper, template, context, response 59 form = forms.FormWrapper(manipulator, new_data, errors)59 form = oldforms.FormWrapper(manipulator, new_data, errors) 60 60 if not template_name: 61 61 template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower()) … … 129 129 new_data = manipulator.flatten_data() 130 130 131 form = forms.FormWrapper(manipulator, new_data, errors)131 form = oldforms.FormWrapper(manipulator, new_data, errors) 132 132 if not template_name: 133 133 template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower()) django/trunk/docs/forms.txt
r4052 r4208 3 3 =============================== 4 4 5 Forwards-compatibility note 6 =========================== 7 8 The legacy forms/manipulators system described in this document is going to be 9 replaced in the next Django release. If you're starting from scratch, we 10 strongly encourage you not to waste your time learning this. Instead, learn and 11 use the django.newforms system, which we have begun to document in the 12 `newforms documentation`_. 13 14 If you have legacy form/manipulator code, read the "Migration plan" section in 15 that document to understand how we're making the switch. 16 17 .. _newforms documentation: http://www.djangoproject.com/documentation/newforms/ 18 19 Introduction 20 ============ 21 5 22 Once you've got a chance to play with Django's admin interface, you'll probably 6 23 wonder if the fantastic form validation framework it uses is available to user 7 24 code. It is, and this document explains how the framework works. 8 9 .. admonition:: A note to the lazy10 11 If all you want to do is present forms for a user to create and/or12 update a given object, you may be able to use `generic views`_.13 25 14 26 We'll take a top-down approach to examining Django's form validation framework, … … 42 54 but what if you want to allow public users to submit places? 43 55 44 Manipulators45 ============ 56 Automatic Manipulators 57 ====================== 46 58 47 59 The highest-level interface for object creation and modification is the 48 ** Manipulator** framework. A manipulator is a utility class tied to a given49 model that "knows" how to create or modify instances of that model and how to 50 validate data for the object. Manipulators come in two flavors: 51 ``AddManipulators`` and ``ChangeManipulators``. Functionally they are quite 52 similar, but the former knows how to create new instances of the model, while53 the latter modifies existing instances. Both types of classes are automatically 54 created when you define a new class::60 **automatic Manipulator** framework. An automatic manipulator is a utility 61 class tied to a given model that "knows" how to create or modify instances of 62 that model and how to validate data for the object. Automatic Manipulators come 63 in two flavors: ``AddManipulators`` and ``ChangeManipulators``. Functionally 64 they are quite similar, but the former knows how to create new instances of the 65 model, while the latter modifies existing instances. Both types of classes are 66 automatically created when you define a new class:: 55 67 56 68 >>> from mysite.myapp.models import Place django/trunk/docs/generic_views.txt
r3953 r4208 903 903 In addition to ``extra_context``, the template's context will be: 904 904 905 * ``form``: A ``django. forms.FormWrapper`` instance representing the form905 * ``form``: A ``django.oldforms.FormWrapper`` instance representing the form 906 906 for editing the object. This lets you refer to form fields easily in the 907 907 template system. … … 985 985 In addition to ``extra_context``, the template's context will be: 986 986 987 * ``form``: A ``django. forms.FormWrapper`` instance representing the form987 * ``form``: A ``django.oldforms.FormWrapper`` instance representing the form 988 988 for editing the object. This lets you refer to form fields easily in the 989 989 template system.
