如何将CreateView与ModelForm一起使用

时间:2011-04-24 22:40:15

标签: django django-views

当我提交表单时,我的类AuthorCreateForm出现错误。 NameError 自我没有定义

如何使用CreateForm?

我在Author.py文件中创建了一个类

from django.views.generic import TemplateView, ListView, CreateView
from books.models import Author, Publisher, Book
from books.forms import AuthorForm

class AuthorCreateView(CreateView):
    objAuthorForm = AuthorForm(self.request.POST)

    if(objAuthorForm.save()):
        success = "Form saved!"
    else:
        error = "There was an error!"

我有一个提交到/ Author / Create

的html模板

我的urls.py中有以下行

('^authors/create/$', Author.AuthorCreateView.as_view()),

我在此网址上呈现表单

('^authors/new/$', TemplateView.as_view(template_name="author_new.html")),

我发现基于类的视图令人困惑,有没有人有关于如何将它用于CRUD操作的好教程?

由于

1 个答案:

答案 0 :(得分:183)

你所拥有的是一个python错误 - self未定义。 self通常是类方法本身引用的类实例。

无论如何,我同意,这是一个新的品牌,并没有记录。我认为在这一点上看源是绝对关键的。

为了熟悉基于类的视图,我从子类django.views.generic.base.View开始,它只实现了几个方法,即尝试根据请求方法调用类上的函数(post,get,head , - 看看来源)。

例如,这是用新视图类替换视图函数的第一步:

class MyClassBasedView(View):
    def get(self, request):
        # behave exactly like old style views
        # except this is called only on get request
        return http.HttpResponse("Get")

    def post(self, request):
        return http.HttpResponse("Post")

(r'^foobar/$', MyClassBasedView.as_view())

回到您的具体问题:

所有TemplateView.as_view()都会渲染模板 - CreateView是处理ModelForms和模板渲染(TemplateView)的其他几个类的组合。

因此,对于一个非常基本的示例,mixins用于CreateView使用的类TemplateResponseMixin

我们看到它实现了ModelFormMixinProcessFormViewCreateView,每个都包含这些类的方法列表。


最基本的CreateView

在最基本的级别,为ModelFormMixin的{​​{1}}提供模型或自定义ModelForm类look to the docs

您的CreateView课程类似于以下内容

class AuthorCreateView(CreateView):
    form_class = AuthorForm
    template_name = 'author_new.html'
    success_url = 'success'

设置了这3个核心属性后,请在您的网址中调用它。

('^authors/create/$', Author.AuthorCreateView.as_view()),

渲染页面,您将看到您的ModelForm作为form传递给模板,处理表单验证步骤(传递request.POST /重新渲染,如果无效),以及调用{ {1}}并重定向到form.save()


开始重写类方法

要自定义行为,请重新开始覆盖为success_url记录的方法。

请记住,您只需要像其他常规视图功能一样从其中一种方法返回mixins

HttpResponse中记录的覆盖form_invalid的示例:

ModelFormMixin

随着您的表单变得更加高级,这种逐方法覆盖开始变得非常有用,并最终允许您使用少量代码行构建大型表单,仅覆盖必要的内容。

假设您要传递表单自定义参数,例如class AuthorCreateView(CreateView): form_class = AuthorForm template_name = 'author_new.html' success_url = 'success' def form_invalid(self, form): return http.HttpResponse("form is invalid.. this is just an HttpResponse object") 对象(如果您需要访问表单中的用户,则非常常见):您只需要覆盖request

get_form_kwargs

基于类的视图是智能类使用的一个很好的例子。它为我提供了一个很好的介绍,用于构建我自己的视图和python类的mixins。它节省了无数个小时。

哇,这很久了。认为它最开始只是文档评论的URL :)希望有所帮助!