如何将CreateView与ModelForm一起使用

iJK*_*iJK 52 django django-views

当我提交表单时,我在我的类AuthorCreateForm中收到错误.未定义NameError self

我如何使用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!"
Run Code Online (Sandbox Code Playgroud)

我有一个提交到/ Author/Create的html模板

我的urls.py中有以下行

('^authors/create/$', Author.AuthorCreateView.as_view()),
Run Code Online (Sandbox Code Playgroud)

我在这个URL上渲染表单

('^authors/new/$', TemplateView.as_view(template_name="author_new.html")),
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Yuj*_*ita 184

你有什么是python错误 - self没有定义.self通常是类方法本身引用的类实例.

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

为了获得舒适与基于类的意见,我会通过子类开始django.views.generic.base.View,它实现只有几个方法,即试图调用基于请求方法的类函数(POST,GET,头, -看源).

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

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())
Run Code Online (Sandbox Code Playgroud)

回到你的具体问题:

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

因此,对于一个非常基本的示例,请查看文档以了解mixins所使用的类CreateView.

我们看到它实现了TemplateResponseMixin,ModelFormMixin并且ProcessFormView每个都包含这些类的方法列表.


最基本的CreateView

在最基本的层面上,提供CreateViewModelFormMixin与模型或定制的ModelForm类作为记录在这里.

您的CreateView课程将如下所示

class AuthorCreateView(CreateView):
    form_class = AuthorForm
    template_name = 'author_new.html'
    success_url = 'success'
Run Code Online (Sandbox Code Playgroud)

设置这3个核心属性后,请在您的URL中调用它.

('^authors/create/$', Author.AuthorCreateView.as_view()),
Run Code Online (Sandbox Code Playgroud)

渲染页面,您将看到您的ModelForm传递给模板form,处理表单验证步骤(传入request.POST/重新渲染,如果无效),以及调用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")
Run Code Online (Sandbox Code Playgroud)

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

假设您要传递表单自定义参数,例如request对象(如果您需要访问表单中的用户,则非常常见):您只需要覆盖get_form_kwargs.

class MyFormView(FormView):
    def get_form_kwargs(self):
        # pass "user" keyword argument with the current user to your form
        kwargs = super(MyFormView, self).get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这太棒了,你是天赐之物.django家伙应该付给你顶级dollah来写doco! (6认同)
  • 血腥的耸人听闻! (5认同)
  • 很好的回应!非常感谢您的宝贵时间 (4认同)
  • 哇,非常感谢.这肯定有帮助.这促使我朝着正确的方向前进. (3认同)
  • 我一直在互联网上看了将近一天.这是最好的答案! (3认同)
  • 课程允许的组织真棒!我不知道为什么我从来没有创建过类视图. (2认同)