0

我想创建一个表单以插入多个页面。在下面的示例中,我创建了一个模板“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" %}
....
4

2 回答 2

3

{% include %}ing 是一种在模板中包含附加 html 的方法。它不会将用户路由到各种不同的views

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

所有变量都应在view您使用的范围内设置。因此,您需要创建一个表单对象并将其全部传递给index. 那时, insideform.htmlindex.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)

视图知道他们引用的一个模板。模板不知道视图,只知道你给它们的上下文/变量。

于 2012-09-12T22:15:26.330 回答
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')
于 2012-09-12T23:54:00.010 回答