如何在 Django 的 context_processors 中包含基于 class 的视图?
how to include class based views in context_processors in django?
我在 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)
我想通过使用上下文将其包含在所有视图中 processors.I 我收到此错误:
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
如何在所有模板中传递这个表单?
我认为您不了解上下文处理器的概念。这些是将内容添加到 context 的简单函数,后者是由 django 管理并发送到每个模板的字典。
上下文处理器允许您将自己的键和值添加到此字典,然后可用于所有模板。
在上下文处理器中,您只需 return 一个包含自定义 key/value 对的字典 - 仅此而已,例如:
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 !!
我从你的回答中找到了解决方案。
首先,我在 context_processor
中包含了我的表格(实际上是 crispy-form)
from .forms import ContactForm
def contform(request):
somevariable = {}
somevariable['contform'] = ContactForm()
return somevariable
最后在任何模板中:
{% crispy contform %}
我在 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)
我想通过使用上下文将其包含在所有视图中 processors.I 我收到此错误:
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
如何在所有模板中传递这个表单?
我认为您不了解上下文处理器的概念。这些是将内容添加到 context 的简单函数,后者是由 django 管理并发送到每个模板的字典。
上下文处理器允许您将自己的键和值添加到此字典,然后可用于所有模板。
在上下文处理器中,您只需 return 一个包含自定义 key/value 对的字典 - 仅此而已,例如:
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 !! 我从你的回答中找到了解决方案。
首先,我在 context_processor
中包含了我的表格(实际上是 crispy-form)from .forms import ContactForm
def contform(request):
somevariable = {}
somevariable['contform'] = ContactForm()
return somevariable
最后在任何模板中:
{% crispy contform %}