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

如何使用 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()),

我在此 URL 处呈现表单
('^authors/new/$', TemplateView.as_view(template_name="author_new.html")),

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

谢谢

最佳答案

你有一个 python 错误——self 没有定义。 self 通常是指类方法上的类实例本身。

无论如何,我同意,它是全新的,而不是记录在案的。我认为在这一点上查看来源绝对是关键。

为了适应基于类的 View ,我首先将 django.views.generic.base.View 子类化,它只实现了几个方法,即尝试根据请求方法(post、get、head,查看源代码)调用类上的函数。

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

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 )的几个其他类的组合。

因此,对于一个非常基本的示例, look to the docs 用于 mixins 使用的 CreateView 类。

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

最基本的 CreateView

在最基本的层面上,为 CreateViewModelFormMixin 提供模型或自定义 ModelForm 类 as documented here.

您的 CreateView 类将如下所示
class AuthorCreateView(CreateView):
    form_class = AuthorForm
    template_name = 'author_new.html'
    success_url = 'success'

设置了这 3 个核心属性后,在您的 URL 中调用它。
('^authors/create/$', Author.AuthorCreateView.as_view()),

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

开始覆盖类方法

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

请记住,您只需像任何常规 View 函数一样从这些方法之一返回 mixins 即可。

示例覆盖 HttpResponse 记录在 form_invalid 中:
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")

随着表单变得越来越高级,这种按方法覆盖开始变得非常有用,并最终让您可以使用少量代码构建巨大的表单,只覆盖必要的内容。

假设您想传递表单自定义参数,例如 ModelFormMixin 对象(如果您需要访问表单中的用户,则非常常见):您只需要覆盖 request
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

基于类的 View 是智能类使用的光辉例子。它给了我一个很好的介绍,可以为我自己的 View 和 Python 类构建自己的 mixin。它节省了无数个小时。

哇这长了。认为它只是作为文档评论的 URL 开始的:)

关于django - 如何将 CreateView 与 ModelForm 一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5773724/

10-16 23:55