【问题标题】:django TemplateView and formdjango TemplateView 和表单
【发布时间】:2011-12-29 07:54:43
【问题描述】:

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

这是读取和打印表单的代码(老式方式):

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,
    })

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

【问题讨论】:

  • 为什么 -3 我的问题有什么问题?

标签: django forms django-templates


【解决方案1】:

改用 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 更有意义。

【讨论】:

  • 我也坚持使用 TemplateView,它似乎对我的目的来说是最灵活的。我有时也会覆盖 get。
【解决方案2】:

我建议您只是通过official tutorial 慢慢来,我认为觉悟会黎明,启蒙会自动到来。

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

  1. 通过 urls.py 中定义的模式将myblog/foo/bar 解析为函数/方法调用
  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"

所有views.generic.*View 类都以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() 等。 你可以覆盖它。

引用文档:

类视图

调度(请求,*args,**kwargs)

视图的视图部分——接受请求的方法 参数加上参数,并返回一个 HTTP 响应。默认 实现将检查 HTTP 方法并尝试委托给 与 HTTP 方法匹配的方法;一个 GET 将被委托给 get()、POST 到 post() 等等。

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

基于类的视图的一大优点(在我看来):

  1. 继承使他们枯燥。
  2. 更具声明性的编程形式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 2018-11-18
    • 1970-01-01
    • 2018-03-13
    • 2014-07-07
    • 2013-09-03
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多