Джанго — ссылка при отправке

У меня есть форма с кнопкой POST Submit. Я хочу ссылаться на новую страницу при отправке формы и при вызове form.is_valid().

Ссылку лучше сделать в представлении или в шаблоне? Как это сделать?

вид.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 %}

person Below the Radar    schedule 18.02.2013    source источник
comment
Что это значит «когда form.is_valid()»? Вы хотите проверить форму на этой требуемой странице или вам нужна страница, которая получает перенаправление после успешной проверки на предыдущей странице?   -  person sergzach    schedule 18.02.2013


Ответы (3)


Вы можете использовать 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))
person Below the Radar    schedule 18.02.2013

Конечно. Просто верните render_to_response внутри вашего условного выражения для request.method == 'POST' или, при желании, просто настройте контекст и шаблон как переменные для передачи в 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.

person Brandon    schedule 18.02.2013

Если я правильно понял ваш вопрос.

Ваше мнение:

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*.

person sergzach    schedule 18.02.2013