2012-01-14 3 views
0

Я использую Python 2.7, Django 1.3.1.Django перенаправление на другой вид со связанной формой

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

Мой текущий код (simplfied):

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> 

ответ

2

Не с обратной стороны. Reverse получает вам путь/my-homepage/

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

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

Затем на успех возвращать HttpResponseRedirect к следующему:

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

Это прочный, потому что если есть проблема, вы отобразить форму с ошибками на/счета/логин/странице скрытая следующая переменная, и пользователь все еще возвращается туда, где они были.

+0

Это просто перенаправление на страницу orignal при успешном завершении. Меня беспокоит, когда login_form недействителен. Я хотел бы перенаправить на представление, соответствующее исходной странице (да, ссылка на это может быть получена с помощью «следующего» параметра) с связанной формой, указывающей на ошибки. – saurabh

+0

Это может быть мило, но также может быть катастрофой. Если есть ошибки, не хотите ли вы, чтобы пользователь на одной странице со своим фокусом явно зафиксировал ошибку? – Ted

+0

Да. Это одно возможное решение, но недостатком является то, что пользователь перенаправляется на страницу, которая выглядит по-другому. Я хочу знать, может ли неудачная переадресация быть сделана на той же странице. Кажется, ответ - нет? – saurabh