【问题标题】:Django - Link on submitDjango - 提交链接
【发布时间】:2013-02-03 03:48:19
【问题描述】:

我有一个带有 POST 提交按钮的表单。我想在提交表单和 form.is_valid() 时链接到新页面。

在视图中还是在模板中创建链接更好?怎么做?

view.py:

from django.shortcuts import render_to_response
from ezmapping.models import *
from django.forms.models import modelformset_factory

def setName(request):
    ezAppFormSet = modelformset_factory(ezApp, extra=1, fields=('name'))
    formset = ezAppFormSet(queryset=ezApp.objects.none())
    if request.method == 'POST':
        formset = ezAppFormSet(request.POST, request.FILES)
        if formset.is_valid():
            formset.save()
    return render_to_response("project/manage_new.html", {'formset': formset, 'title': "New"}, context_instance=RequestContext(request))

模板.html

 {% extends "basemap.html" %}
 {% block content %}
 <table border="1">
   <tr>
   <td>
    <h1>Define new App options</h1>
    {% if formset.errors %}
        <p style="color: red;">
            Please correct the error{{ formset.errors|pluralize }} below.
        </p>
    {% endif %}
    <form method="post" action="." encrypt="multipart/form-data">{% csrf_token %}
            {{ formset.as_p }}
        <input type="submit" value="Submit">
    </form>
</td>
</tr>
</table>
{% endblock %}

【问题讨论】:

  • “当 form.is_valid()”是什么意思?您想在此必填页面上验证表单,还是希望在前一页面成功验证后获得重定向的页面?

标签: django django-forms django-views


【解决方案1】:

您可以像这样在视图中使用 HttpResponseRedirect():

from django.shortcuts import render_to_response
from ezmapping.models import *
from django.forms.models import modelformset_factory

def setName(request):
    ezAppFormSet = modelformset_factory(ezApp, extra=1, fields=('name'))
    formset = ezAppFormSet(queryset=ezApp.objects.none())
    if request.method == 'POST':
        formset = ezAppFormSet(request.POST, request.FILES)
        if formset.is_valid():
            formset.save()
            next_link = u"/next/"
            return HttpResponseRedirect(next_link)

    return render_to_response("project/manage_new.html", {'formset': formset, 'title': "New"}, context_instance=RequestContext(request))

【讨论】:

    【解决方案2】:

    当然。只需在 request.method == 'POST' 的条件内返回一个 render_to_response,或者可选地,只需将上下文和模板设置为变量以传递给 render_to_response:

    释义:

    def foo(request):
        template = 'template1.html'
        # form and formsets here set into `context` as a dictionary
    
        if request.method == 'POST':
            template = 'template2.html'
    
        return render_to_response(template, context)
    

    [编辑]

    当我重新阅读您的问题时,如果您想在表单有效的情况下重定向到不同的视图,则改为返回 HttpResponseRedirect。

    【讨论】:

      【解决方案3】:

      如果我正确理解了您的问题。

      你的看法:

      from django.shortcuts import render_to_response
      from ezmapping.models import *
      from django.forms.models import modelformset_factory
      
      def setName(request):
          ezAppFormSet = modelformset_factory(ezApp, extra=1, fields=('name'))
          formset = ezAppFormSet(queryset=ezApp.objects.none())
          if request.method == 'POST':
              formset = ezAppFormSet(request.POST, request.FILES)
              if formset.is_valid():
                  formset.save()
                  submit_link = True # 2*
              else:
                  submit_link = False
          return render_to_response("project/manage_new.html", {'submit_link': submit_link, 'formset': formset, 'title': "New"}, context_instance=RequestContext(request))
      

      您的模板:

      {% extends "basemap.html" %}
       {% block content %}
       <table border="1">
         <tr>
         <td>
          <h1>Define new App options</h1>
          {% if formset.errors %}
              <p style="color: red;">
                  Please correct the error{{ formset.errors|pluralize }} below.
              </p>
          {% endif %}
          <form method="post" action="." encrypt="multipart/form-data">{% csrf_token %}
                  {{ formset.as_p }}
              <input type="submit" value="Submit">
          </form>
      
          {% if submit_link %} 
            <a href='/next/'>Data is saved, let's continue.</a>
          {% endif %}
      </td>
      </tr>
      </table>
      {% endblock %}
      

      更新

      是的,如果您想重定向(不显示下一个链接),只需放置:

      from django.shortcuts import redirect
      ...
      return redirect( 'you-url' )
      

      而不是 2*。

      【讨论】:

        猜你喜欢
        • 2018-03-02
        • 2011-10-21
        • 1970-01-01
        • 2014-04-10
        • 2021-07-31
        • 1970-01-01
        • 2014-02-24
        • 2014-01-31
        • 2021-03-17
        相关资源
        最近更新 更多