如何在ModelForm中使用CreateView?
当我提交表单时,在我的类AuthorCreateForm中出现错误。 NameError self未定义
我如何使用CreateForm?
我在我的Author.py文件中创build了一个类
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!"
我有一个提交给/作者/创build的HTML模板
我在我的urls.py中有以下行
('^authors/create/$', Author.AuthorCreateView.as_view()),
我在这个URL上呈现表单
('^authors/new/$', TemplateView.as_view(template_name="author_new.html")),
我发现基于类的视图混淆,没有人有一个很好的教程如何使用它的CRUD操作?
谢谢
你有什么是一个Python错误 – self
没有定义。 self
通常是指类方法本身的类实例本身。
无论如何,我同意,这是品牌崭新的,而不是logging。 我认为在这一点上看源头绝对是关键。
为了适应基于类的视图,我首先通过django.views.generic.base.View
来实现,它只实现了几个方法,即试图根据请求方法调用一个函数(post,get,头, – 看源头)。
例如,下面是用新视图类replace视图函数的第一步:
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
)的其他几个类的组合。
因此,对于一个非常基本的示例,请查看文档以了解CreateView
使用的类mixins
。
我们看到它实现了TemplateResponseMixin
, ModelFormMixin
和ProcessFormView
,每个都包含这些类的方法列表。
最基本的CreateView
在最基本的层面上,为CreateView
的ModelFormMixin
提供模型或自定义的ModelForm类, 如下所述。
你的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
传递给模板,处理表单validation步骤(传递request.POST
/重新渲染,如果无效),以及调用form.save()
并redirect到form.save()
。
开始重写类方法
要自定义行为,请开始覆盖为mixins
logging的方法。
请记住,您只需像任何常规视图函数一样从这些方法之一返回HttpResponse
。
在ModelFormMixin
logging覆盖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")
随着你的表单变得更加先进,这个每个方法的覆盖开始变得非常有用,并且最终让你用一些代码行来构build巨大的表单,只覆盖必要的东西。
假设你想传递你的表单自定义参数,例如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
基于类的视图是智能类使用的一个光辉的例子。 它为我提供了一个很好的介绍,用于构build自己的混合视图和Python类。 这是节省无数小时。
哇,这很长。 认为它开始只是文档的评论:)希望帮助!