2015-03-16 8 views
1

Для входа и выхода из системы я использую встроенное представление Django в django.contrib.auth.views. Очень легко перенаправить пользователя на предыдущую страницу, потому что вы можете передать «следующий» параметр в окно входа/выхода из системы. Они работают отлично.Перенаправление на предыдущую страницу после регистрации в Django

Когда я хочу выполнить аналогичную функциональность для регистрации, есть некоторые проблемы. Похоже, что Django не имеет встроенного регистрационного представления. Поэтому я использую CreateView с 'model = User'. Коды следующие:

#views.py 

class Registration(CreateView): 
    template_name='accounts/registration.html' 
    model=User 

    #Overwrite form_valid() to log this new user in after his successful registartion 
    def form_valid(self, form): 
     validation=super(Registration, self).form_valid(form) 

     username=form.cleaned_data['username'] 
     password=form.cleaned_data['password2'] 
     user=authenticate(username=username, password=password) 
     login(self.request, user) 

     return validation 

Теперь у меня нет такой же «следующий параметр», как и в встроенном входа/выхода из системы зрения. Затем, как я могу перенаправить нового пользователя на предыдущую страницу после регистрации?

Я попробовал следующий метод:

Step1: Из шаблона, который будет инициировать мой взгляд регистрации, пройти «следующий параметр» с помощью метода GET.

<a href="{% url 'accounts:Registration' %}?next={{request.path}}">Registration</a> 

Кстати, URL-адрес, связанные с регистрацией является:

#accounts/urls.py 

urlpatterns = patterns('', 
    # Others 
    url(r'^registration/$', views.Registration.as_view(), name='registration'), 
) 

Шаг2: Перезапишите get_context_data() и get_success_url() методы, пытаясь построить свой собственный 'следующий параметр' :

#views.py 

    class Registration(CreateView): 

     # other codes as above 

     def get_context_data(self, **kwargs): 
       context=super(Registration, self).get_context_data(**kwargs) 
       context[next]=self.request.GET['next'] 
       return context 

     def get_success_url(self): 
       redirect_to=self.request.POST['next'] 
       return redirect_to 

Step3: В моей Templ ели, добавить «скрытый» поле ввода, чтобы провести следующее значение:

# accounts/registration.html 

<form method="post" action="{% url 'accounts:registration' %}" > {% csrf_token %} 
    <p> 
    {{form.as_p}} 
    </p> 
    <input type="submit" value="Regsitarte" /> 
    <input type="hidden" name="next" value={{next}} /> 
</form> 

Этот метод только хорошо работает, когда пользователь не делает ни одной ошибки во время его процедуры регистрации. Если, например, пользовательские POST-файлы с именем пользователя, которое существует, или формат адреса электронной почты является недопустимым, этот метод сообщит об ошибке «следующий» параметр.

Может ли кто-нибудь дать метод для перенаправления пользователя после регистрации? Или Можете ли вы изменить мои коды для выполнения этой функции? Я бы хотел использовать встроенные классы Django Generic Views, вместо того, чтобы писать новый вид с нуля.

ответ

1

Если оставить HTML формы action атрибут пустым, то по умолчанию в URL текущей страницы, GET параметры запроса и все.

Если вы измените форму, чтобы удалить скрытое поле и удалить действие, он должен работать нормально:

<form method="post"> 
    <p> 
    {{form.as_p}} 
    </p> 
    <input type="submit" value="Regsitarte" /> 
</form> 
+0

Спасибо! Фактически, я использую метод .load() JQuery для загрузки моей registration.html на любую страницу, которую пользователь видит сейчас. Поэтому, если я оставляю «действие» пустым, он не может найти правильный URL-адрес, поскольку текущая страница может не быть страницей регистрации. Но вы даете мне вдохновение. Я изменяю «действие» на '

'. Затем он решает мою проблему. Большое спасибо! –

Смежные вопросы