我有一些问题要弄清楚新的django视图(模板视图)和表单是如何工作的我也找不到好资源,官方文档不解释我怎么能得到请求(我的意思是获取和发布)和新的django views class中的表单
由于
添加了更好的解释
例如,我有这样的形式:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField()
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
这是用于读取和打印表单的代码(旧时尚方式):
def contact(request):
if request.method == 'POST': # If the form has been submitted...
form = ContactForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
# ...
return HttpResponseRedirect('/thanks/') # Redirect after POST
else:
form = ContactForm() # An unbound form
return render_to_response('contact.html', {
'form': form,
})
我的问题是你如何用模板视图做同样的事情谢谢
答案 0 :(得分:34)
使用FormView,即
from django.views.generic import TemplateView, FormView
from forms import ContactUsEmailForm
class ContactView(FormView):
template_name = 'contact_us/contact_us.html'
form_class = ContactUsEmailForm
success_url = '.'
def get_context_data(self, **kwargs):
context = super(ContactView, self).get_context_data(**kwargs)
#context["testing_out"] = "this is a new context var"
return context
def form_valid(self, form):
# This method is called when valid form data has been POSTed.
# It should return an HttpResponse.
#form.send_email()
#print "form is valid"
return super(ContactView, self).form_valid(form)
从技术上讲,也可以使用TemplateView,只需覆盖post方法,因为默认模板视图不允许你发布到它:
class ContactUsView(TemplateView):
template_name = 'contact_us/contact_us.html'
def post(self, request, *args, **kwargs):
context = self.get_context_data()
if context["form"].is_valid():
print 'yes done'
#save your model
#redirect
return super(TemplateView, self).render_to_response(context)
def get_context_data(self, **kwargs):
context = super(ContactUsView, self).get_context_data(**kwargs)
form = ContactUsEmailForm(self.request.POST or None) # instance= None
context["form"] = form
#context["latest_article"] = latest_article
return context
我认为FormView更有意义。
答案 1 :(得分:14)
我建议只是逐渐探讨official tutorial,我认为实现将会曙光,启示将自动产生。
基本上: 当您发出请求时:'''http:// mydomain / myblog / foo / bar''' Django会:
myblog/foo/bar
到函数/方法调用
myblog.views.foo_bar_index(request)
。视图功能通常执行以下操作:
模板通用视图允许您跳过编写该功能,并只传入上下文字典。
引用django文档:
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
所有views.generic。*视图类以views.generic.View为基础。在docs中找到您需要的信息。 基本上是:
# urls.py
urlpatterns = patterns('',
(r'^view/$', MyView.as_view(size=42)),
)
MyView.as_view将生成一个调用views.generic.View.dispatch()的可调用对象 而这又将调用MyView.get(),MyView.post(),MyView.update()等。 你可以覆盖它。
引用文档:
课程视图
dispatch(request,* args,** kwargs)
视图的视图部分 - 接受请求的方法 参数加参数,并返回HTTP响应。默认 实现将检查HTTP方法并尝试委托 与HTTP方法匹配的方法; GET将被委派给 get(),发布post()等等。
默认实现还将request,args和kwargs设置为 实例变量,因此视图上的任何方法都可以知道完整 用于调用视图的请求的详细信息。
基于班级观点的重大优势(在我看来):