【问题标题】:how to include class based views in context_processors in django?如何在 django 的 context_processors 中包含基于类的视图?
【发布时间】:2016-01-05 07:43:06
【问题描述】:

我在 context_processors.py

中有这段代码
class ContactFormView(FormView):
    form_class = ContactForm
    template_name = "blog/contact.html"
    success_url = "/contact/"
    def form_valid(self,form):
       contact_name = form.cleaned_data.get('contact_name')
       contact_email = form.cleaned_data.get('contact_email')
       form_content  = form.cleaned_data.get('content','')
       try:
          send_mail(contact_name,form_content,contact_email,[settings.EMAIL_HOST_USER], fail_silently=False)
       except BadHeaderError:
          return HttpResponse('Invalid Header Found')
       return super(ContactFormView,self).form_valid(form)

我想通过使用上下文处理器将其包含在所有视图中。我收到此错误:

TypeError at /
__init__() takes exactly 1 argument (2 given)
Request Method: GET
Request URL:    http://127.0.0.1:8000/
Django Version: 1.8.7
Exception Type: TypeError
Exception Value:    
__init__() takes exactly 1 argument (2 given)
Exception Location: C:\Python27\lib\site-packages\django-1.8.7-py2.7.egg\django\template\context.py in bind_template, line 241
Python Executable:  C:\Python27\python.exe
Python Version: 2.7.10

如何在所有模板中传递这个表单?

【问题讨论】:

  • 而不是将图像发布到错误中发布实际文本以及重现它所需的代码(即堆栈跟踪)
  • 好吧,作为一个新手,您的建议是积极的..
  • 这个问题完全没有意义。视图是视图,而不是上下文处理器。
  • @Daniel Roseman 为什么?我想在所有模板中包含基于类的表单,所以我将它包含在 context_processor 中以访问每个模板!!
  • 但是上下文处理器不是视图。上下文处理器是一个函数,它接受一个请求并返回一个字典以添加到上下文中;视图要复杂得多,并返回完整的 HTTP 响应。

标签: django django-forms django-views


【解决方案1】:

我认为您不了解上下文处理器的概念。这些是向 context 添加内容的简单函数,context 是由 django 管理并发送到每个模板的字典。

上下文处理器允许您将自己的键和值添加到此字典中,然后在您的所有模板中都可用。

在上下文处理器中,您只需返回带有自定义键/值对的字典 - 仅此而已,例如:

from someapp.forms import ContactForm

def ctx_contact_form(request):
    return {'contact-form': ContactForm()}

现在,在所有模板中,您都可以使用{{ contact-form }}。请记住,您仍然需要在模板中编写周围的 HTML:

<form method="post" action="{% url 'your-view' %}">
   {{ contact-form }}
   <input type="submit">
</form>

如果您想为您编写那部分,那么您只需在模板中输入{{ contact-form }},然后您需要编写custom template tag,这涉及几个步骤。

首先,创建一个简单的模板,比如_formtag.html,并包含上面的 HTML:

<form method="post" action="{% url 'your-view' %}">
       {{ contact-form }}
       <input type="submit">
</form>

接下来,在您的应用程序中创建一个名为templatetags 的目录,在其中创建一个名为__init__.py 的空文件,然后创建另一个名为app_form_tags.py 的文件;在这个app_form_tags.py 文件中,添加以下代码:

from django import template
from yourapp.forms import ContactForm

register = template.Library()

@register.inclusion_tag('_formtag.html')
def contact_form():
    return {'contact-form': ContactForm()}

最后,无论您想在哪里显示该表单(在模板中),只需添加

{% load app_form_tags %}

在文件的顶部,然后是 {% contact_form %} 您希望表单所在的位置。

您的其余代码(即处理表单)必须照常写入视图中。

【讨论】:

  • 非常感谢您的回复。我实际上知道这个上下文处理器的概念,但不知道如何使用它!再次感谢您!
  • Burhan Khalid,非常感谢您的明确回答。这帮助我得到了我需要的东西。我有 1 个问题。我尝试了两种方式(处理器和模板标签)。我不清楚哪个更适合使用。你能告诉我区别吗?两者都解决了相同的问题(登录表单)。
【解决方案2】:

感谢@Burhan Khalid! 我从您的回答中找到了解决方案。

首先我在 context_processor 中包含了我的表单(实际上是一个脆的表单)

from .forms import ContactForm
    def contform(request):
        somevariable = {}
        somevariable['contform'] = ContactForm()
        return somevariable

最后在任何模板中:

{% crispy contform %}

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 2019-08-29
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2011-11-10
    相关资源
    最近更新 更多