【问题标题】:Multiple views call and template inclusion多视图调用和模板包含
【发布时间】:2012-09-05 22:42:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    所有变量都应该在您使用的view 中设置。因此,您需要创建一个表单对象并将其全部传递到index。此时,index.html 中的 form.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)
    

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

    【讨论】:

      【解决方案2】:

      这是@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')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-17
        • 2011-08-18
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 2014-03-12
        • 2013-06-18
        • 2014-01-19
        相关资源
        最近更新 更多