Django перенаправляет на другой вид со связанной формой - PullRequest
0 голосов
/ 14 января 2012

Я использую Python 2.7, Django 1.3.1.

Я пытаюсь реализовать функцию входа в систему, которая может быть вызвана с произвольной страницы и перенаправляет на ту же страницу без какого-либо дублирования кода.В настоящее время у меня есть два представления: одно для домашней страницы и одно для входа. Я хочу иметь возможность перенаправить из представления sign_in на домашний вид с связанной формой .Основная проблема заключается в том, что когда пользователь вводит неверные данные (например, неверный пароль), я хочу перенаправить на ту же страницу, но хочу отправить контекст исходной формы.Я хочу иметь возможность сделать это без явного вызова функции представления, поскольку я хочу иметь возможность сделать это с произвольной страницы.Как мне это сделать?Мои текущие попытки всегда возвращают несвязанную форму, если данные неверны.

Мой текущий код (упрощенный):

urls.py

urlpatterns = patterns('myapp.views',
    url(r'^$', 'index', name='home'),
    url(r'sign_in/^$', 'signin', name='sign_in')
)

views.py

def index(request, loginForm=LoginForm)
    extra_context = dict()
    extra_context['login_form'] = loginForm
    return direct_to_template(request, 'home.html', extra_context=extra_context)

def signin(request)
    if request.method == 'POST':
        login_form = LoginForm(request.POST, request.FILES)
        if login_form.is_valid():
            # login user 
        redirect_view = reverse('home')
        return redirect(redirect_view, kwargs={'loginForm': login_form})
        # I also tried:  
        # return redirect(redirect_view, loginForm=login_form)
        # what works is:
        # return index(request, loginForm = login_form)

home.html

<form action="{% url sign_in %}" method="post">
    {{ form.as_p }}
</form>

1 Ответ

2 голосов
/ 14 января 2012

Не с реверсом.Обратное дает вам путь / my-homepage /

Парадигма django для этого заключается в использовании скрытой переменной «next», установленной на начальной странице.

#In your template
<input type="hidden" value="{{ request.path }}" name="next" />

Затем при успешном возвращенииHttpResponseRedirect to next:

     if login_form.is_valid():
         # login user 
         return HttpResponseRedirect(form.cleaned_data['next'])

Это длительно, потому что, если есть проблема, вы отображаете форму с ошибками на / account / login / page со скрытой переменной next, и пользователь по-прежнему возвращаетсятуда, где они были.

...