Для входа и выхода я использую встроенное представление Django в django.contrib.auth.views. Перенаправить пользователя на предыдущую страницу очень просто, потому что вы можете передать параметр «следующий» в представление входа / выхода. Работают нормально.
Когда я хочу выполнить аналогичную функцию для регистрации, возникают некоторые проблемы. Похоже, что в 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
Теперь у меня нет аналогичного параметра «следующий», как во встроенном представлении входа / выхода. Тогда как я могу перенаправить нового пользователя на предыдущую страницу после регистрации?
Я попробовал следующий метод:
Шаг 1: из шаблона, который запустит мое представление "Регистрация", передайте параметр "следующий" с помощью метода GET.
<a href="{% url 'accounts:Registration' %}?next={{request.path}}">Registration</a>
Кстати, адрес, связанный с регистрацией:
#accounts/urls.py
urlpatterns = patterns('',
# Others
url(r'^registration/$', views.Registration.as_view(), name='registration'),
)
Шаг 2: перезапишите методы get_context_data () и get_success_url (), пытаясь создать свой собственный параметр 'next':
#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
Шаг 3: в моем шаблоне добавьте «скрытое» поле ввода для хранения следующего значения:
# 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 на основе классов вместо написания нового представления с нуля.