django TemplateView和表单

LXG*_*LXG 13 forms django django-templates

我有一些问题要弄清楚新的django视图(模板视图)和表单是如何工作的我也找不到好资源,官方文档不解释我如何获取请求(我的意思是获取和发布)和新的表单django观看课程

谢谢

添加了更好的解释

例如,我有这样的形式:

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

这是用于读取和打印表单的代码(旧时尚方式):

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

好吧,我的问题是如何用模板视图做同样的事情谢谢

rad*_*tek 36

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

有关Django Docs中FormView的更多信息

从技术上讲,也可以使用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
Run Code Online (Sandbox Code Playgroud)

我认为FormView更有意义.

  • 我也坚持使用 TemplateView,它似乎对我的目的来说是最灵活的。我有时也会覆盖get。 (2认同)

And*_*asT 15

我建议只是通过官方教程,我认为实现将黎明,启蒙将自动到来.

基本上:当你发出请求时:'''http:// mydomain/myblog/foo/bar'''Django会:

  1. myblog/foo/bar通过urls.py中定义的模式解析函数/方法调用
  2. 以请求作为参数调用该函数,例如myblog.views.foo_bar_index(request).
  3. 并且只需将函数返回的任何字符串发送到浏览器.通常这是你生成的html代码.

视图函数通常执行以下操作:

  1. 填写视图的上下文字典
  2. 使用该上下文呈现模板
  3. 返回结果字符串

模板通用视图允许您跳过编写该函数,并只传入上下文字典.

引用django文档:

from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = "about.html"
Run Code Online (Sandbox Code Playgroud)

所有views.generic.*视图类都以views.generic.View为基础.在文档中,您可以找到所需的信息.基本上:

# urls.py
urlpatterns = patterns('',
        (r'^view/$', MyView.as_view(size=42)),
    )
Run Code Online (Sandbox Code Playgroud)

MyView.as_view将生成一个调用views.generic.View.dispatch()的callable,后者将调用您可以覆盖的MyView.get(),MyView.post(),MyView.update()等.

引用文档:

课程视图

派遣(请求,*args,**kwargs)

视图的视图部分 - 接受请求参数和参数的方法,并返回HTTP响应.默认实现将检查HTTP方法并尝试委托给与HTTP方法匹配的方法; 一个GET将被委托给get(),一个POST到post(),依此类推.

默认实现还将request,args和kwargs设置为实例变量,因此视图上的任何方法都可以知道调用视图的请求的完整详细信息.

基于类的观点的大加分(在我看来):

  1. 继承使他们变得干燥.
  2. 更具声明性的编程形式