From 4f5170bffe8ca6ce8da0f68c4834066b0c766b43 Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Fri, 15 Dec 2006 22:33:24 +0000 Subject: [PATCH] newforms: The Form classes created by form_for_model() now have a create() method, which creates a model instance from the clean_data git-svn-id: http://code.djangoproject.com/svn/django/trunk@4216 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/newforms/models.py | 11 ++++- tests/modeltests/model_forms/models.py | 57 ++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/django/newforms/models.py b/django/newforms/models.py index 58ed29e20f..c8947b78b2 100644 --- a/django/newforms/models.py +++ b/django/newforms/models.py @@ -7,6 +7,15 @@ from forms import BaseForm, DeclarativeFieldsMetaclass, SortedDictFromList __all__ = ('form_for_model', 'form_for_fields') +def create(self, save=True): + "Creates and returns model instance according to self.clean_data." + if self.errors: + raise ValueError("The %s could not be created because the data didn't validate." % self._model._meta.object_name) + obj = self._model(**self.clean_data) + if save: + obj.save() + return obj + def form_for_model(model): "Returns a Form class for the given Django model class." opts = model._meta @@ -16,7 +25,7 @@ def form_for_model(model): if formfield: field_list.append((f.name, formfield)) fields = SortedDictFromList(field_list) - return type(opts.object_name + 'Form', (BaseForm,), {'fields': fields, '_model_opts': opts}) + return type(opts.object_name + 'Form', (BaseForm,), {'fields': fields, '_model': model, 'create': create}) def form_for_fields(field_list): "Returns a Form class for the given list of Django database field instances." diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py index c8dfa5a2a4..f86382abc4 100644 --- a/tests/modeltests/model_forms/models.py +++ b/tests/modeltests/model_forms/models.py @@ -2,6 +2,13 @@ 34. Generating HTML forms from models Django provides shortcuts for creating Form objects from a model class. + +The function django.newforms.form_for_model() takes a model class and returns +a Form that is tied to the model. This Form works just like any other Form, +with one additional method: create(). The create() method creates an instance +of the model and returns that newly created instance. It saves the instance to +the database if create(save=True), which is default. If you pass +create(save=False), then you'll get the object without saving it. """ from django.db import models @@ -23,6 +30,10 @@ class Article(models.Model): __test__ = {'API_TESTS': """ >>> from django.newforms import form_for_model + +>>> Category.objects.all() +[] + >>> CategoryForm = form_for_model(Category) >>> f = CategoryForm() >>> print f @@ -44,4 +55,50 @@ __test__ = {'API_TESTS': """ {} >>> f.clean_data {'url': u'entertainment', 'name': u'Entertainment'} +>>> obj = f.create() +>>> obj + +>>> Category.objects.all() +[] + +>>> f = CategoryForm({'name': "It's a test", 'url': 'test'}) +>>> f.errors +{} +>>> f.clean_data +{'url': u'test', 'name': u"It's a test"} +>>> obj = f.create() +>>> obj + +>>> Category.objects.all() +[, ] + +>>> f = CategoryForm({'name': 'Third test', 'url': 'third'}) +>>> f.errors +{} +>>> f.clean_data +{'url': u'third', 'name': u'Third test'} +>>> obj = f.create(save=False) +>>> obj + +>>> Category.objects.all() +[, ] +>>> obj.save() +>>> Category.objects.all() +[, , ] + +>>> f = CategoryForm({'name': '', 'url': 'foo'}) +>>> f.errors +{'name': [u'This field is required.']} +>>> f.clean_data +>>> f.create() +Traceback (most recent call last): +... +ValueError: The Category could not be created because the data didn't validate. + +>>> f = CategoryForm({'name': '', 'url': 'foo'}) +>>> f.create() +Traceback (most recent call last): +... +ValueError: The Category could not be created because the data didn't validate. + """}