newforms: Added optional 'form' parameter to form_for_model

git-svn-id: http://code.djangoproject.com/svn/django/trunk@4220 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2006-12-17 05:12:53 +00:00
parent e76e2aaffb
commit a0ef6f6915
2 changed files with 18 additions and 4 deletions

View File

@ -16,8 +16,12 @@ def create(self, save=True):
obj.save() obj.save()
return obj return obj
def form_for_model(model): def form_for_model(model, form=None):
"Returns a Form class for the given Django model class." """
Returns a Form class for the given Django model class.
Provide 'form' if you want to use a custom BaseForm subclass.
"""
opts = model._meta opts = model._meta
field_list = [] field_list = []
for f in opts.fields + opts.many_to_many: for f in opts.fields + opts.many_to_many:
@ -25,7 +29,8 @@ def form_for_model(model):
if formfield: if formfield:
field_list.append((f.name, formfield)) field_list.append((f.name, formfield))
fields = SortedDictFromList(field_list) fields = SortedDictFromList(field_list)
return type(opts.object_name + 'Form', (BaseForm,), {'fields': fields, '_model': model, 'create': create}) form = form or BaseForm
return type(opts.object_name + 'Form', (form,), {'fields': fields, '_model': model, 'create': create})
def form_for_fields(field_list): def form_for_fields(field_list):
"Returns a Form class for the given list of Django database field instances." "Returns a Form class for the given list of Django database field instances."

View File

@ -29,7 +29,7 @@ class Article(models.Model):
return self.headline return self.headline
__test__ = {'API_TESTS': """ __test__ = {'API_TESTS': """
>>> from django.newforms import form_for_model >>> from django.newforms import form_for_model, BaseForm
>>> Category.objects.all() >>> Category.objects.all()
[] []
@ -101,4 +101,13 @@ Traceback (most recent call last):
... ...
ValueError: The Category could not be created because the data didn't validate. ValueError: The Category could not be created because the data didn't validate.
You can pass a custom Form class to form_for_model. Make sure it's a
subclass of BaseForm, not Form.
>>> class CustomForm(BaseForm):
... def say_hello(self):
... print 'hello'
>>> CategoryForm = form_for_model(Category, form=CustomForm)
>>> f = CategoryForm()
>>> f.say_hello()
hello
"""} """}