django TemplateView和表单

时间:2011-11-15 08:36:52

标签: django forms django-templates

我有一些问题要弄清楚新的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,
    })

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

2 个答案:

答案 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)

更多关于FormView in Django Docs

从技术上讲,也可以使用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会:

  1. 通过urls.py
  2. 中定义的模式解析myblog/foo/bar到函数/方法调用
  3. 使用请求作为参数调用该函数,例如myblog.views.foo_bar_index(request)
  4. 只需将函数返回的任何字符串发送到浏览器即可。通常这是你生成的html代码。
  5. 视图功能通常执行以下操作:

    1. 填写视图的上下文字典
    2. 使用该上下文呈现模板
    3. 返回结果字符串
    4. 模板通用视图允许您跳过编写该功能,并只传入上下文字典。

      引用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设置为   实例变量,因此视图上的任何方法都可以知道完整   用于调用视图的请求的详细信息。

      基于班级观点的重大优势(在我看来):

      1. 继承使他们干燥
      2. 更多声明性的编程形式
相关问题