我想创建一个表单以插入多个页面。在下面的示例中,我创建了一个模板“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" %}
....
答案 0 :(得分:3)
{% include %}
是一种在模板中包含其他html的方法。它不会通过各种不同的views
在您的代码中,用户将进入index
并获得index.html
。 index.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')