我一直在努力了解django形式(django 1.6),我觉得这很容易。
我的home.html
扩展了我的base.html
。我还有一个ContactForm()
模型,它有一个视图和一个模板(模板名为contact.html
)
这是我想要做的。我希望能够将contact.html
模板带入home.html
模板。问题是当我使用{%include%}时,我丢失了所有的上下文变量。
解决此问题的正确方法是什么?我怀疑,尽管有多少次我阅读并重新阅读教程,但我遗漏了一些基本的东西。
如果你的答案是我的整个方法都错了,你告诉我我应该做什么 - 我也会接受。
以下是我目前无法使用的代码:
forms.py:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
views.py:
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
send_mail(subject, message, sender)
return HttpResponseRedirect('frontpage/thanks/')
else:
form = ContactForm()
return render(request, 'frontpage/contact.html',
{'form': form,})
home.html的:
{% extends 'frontpage/base.html' %}
<!-- lots of markup and template stuff -->
{% block content %}
{% include 'frontpage/contact.html' %}
<!-- lots of markup and template stuff -->
{% endblock %}
contact.html:
<form action="/contact/" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
答案 0 :(得分:1)
{% include %}
代码并不代表“包含此视图+模板”;它意味着“包含模板本身,就像您将模板文本直接复制并粘贴到此处一样,仅此而已。”
因此,它根本没有使用您的联系人视图。
您是否需要将联系人视图作为单独的视图? (即,您是否会将其作为独立页面使用?)如果没有,我会将您的视图逻辑放入驱动主页的任何视图中。
如果您确实需要单独的联系人视图和来在您的主页上显示此内容,我会尝试将表单处理内容分解出来,以便您可以从主页视图和独立的联系视图。我认为基于类视图的这种事情往往更容易。如果将它分解出来对你来说太难了,你可以将这些相同的东西复制并粘贴到主页中 - 这违反了“不要重复自己”的原则,但这是一个非常简单的代码;如果替代方案让你感到困惑,这可能是两个邪恶中较小的一个。
祝你好运!