多个视图调用和模板包含

时间:2012-09-12 21:05:13

标签: django django-templates django-views django-urls

我想创建一个表单以插入多个页面。在下面的示例中,我创建了一个模板“form.html”,并尝试输入“index.html”。我已经有索引视图(在此示例中简化)。因此,我不知道如何调用myform视图以在索引中包含表单。

# urls.py
urlpatterns = patterns('',
    url(r'^$', 'index'),
    url(r'^form$', 'myform'),
)

# views.py
def index(request):
    return render(request, 'index.html')

def myform(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            request.session['name'] = form.cleaned_data['name']
            return HttpResponseRedirect('/form')
    else:
        form = MyForm()

    args = {'form': form}
    return render(request, 'form.html', {'form': form})

# form.html
<form action="/form/ok" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>

# index.html
....
{% include "form.html" %}
....

2 个答案:

答案 0 :(得分:3)

{% include %}是一种在模板中包含其他html的方法。它不会通过各种不同的views

路由用户

在您的代码中,用户将进入index并获得index.htmlindex.html然后会{% include %}内部form.html的内容,但与myform视图无关。在form.html范围内,模板将需要一个名为form的变量。 form尚未在此上下文中设置,因为它未在index中创建,因此不会呈现任何表单内容。 (标签将与它们不依赖于form变量)。

所有变量都应在您正在使用的view内设置。因此,您需要创建一个表单对象并将其全部传递到index。那时form.html中的index.html将收到预期的form变量。

如果你决定在index中不想打电话给你的表格form(假设你有多个表格,那么想要更多有用的名字)。然后你可以{% including "form.html" with form=form_variable_from_index %}。这将基本上重命名表单变量,但仅限于`{%include%}'d文件。

https://docs.djangoproject.com/en/1.4/ref/templates/builtins/#include

# views.py
def index(request):

    # Need to create the form here
    form = MyForm()

    args = {'form': form}
    return render(request, 'form.html', args)

def myform(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            request.session['name'] = form.cleaned_data['name']
            return HttpResponseRedirect('/form')
    else:
        form = MyForm()

    args = {'form': form}
    return render(request, 'form.html', args)

视图知道他们引用的一个模板。模板不了解视图,只知道您提供的上下文/变量。

答案 1 :(得分:1)

这是@ rockingskier答案的扩展。我更改了myform视图以返回变量form并在index视图中调用它。

# urls.py
urlpatterns = patterns('',
    url(r'^$', 'index'),
)

# views.py
def myform(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            request.session['name'] = form.cleaned_data['name']
            return HttpResponseRedirect('/ok')
    else:
        form = MyForm()

    return form

def index(request):
    args['form'] = myform
    return render(request, 'index.html')