django - 在另一个模板中包含表单最常被接受的方式是什么?

时间:2014-03-20 23:25:54

标签: django django-forms

我一直在努力了解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>

1 个答案:

答案 0 :(得分:1)

{% include %}代码并不代表“包含此视图+模板”;它意味着“包含模板本身,就像您将模板文本直接复制并粘贴到此处一样,仅此而已。

因此,它根本没有使用您的联系人视图。

您是否需要将联系人视图作为单独的视图? (即,您是否会将其作为独立页面使用?)如果没有,我会将您的视图逻辑放入驱动主页的任何视图中。

如果您确实需要单独的联系人视图来在您的主页上显示此内容,我会尝试将表单处理内容分解出来,以便您可以从主页视图和独立的联系视图。我认为基于类视图的这种事情往往更容易。如果将它分解出来对你来说太难了,你可以将这些相同的东西复制并粘贴到主页中 - 这违反了“不要重复自己”的原则,但这是一个非常简单的代码;如果替代方案让你感到困惑,这可能是两个邪恶中较小的一个。

祝你好运!