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