Перенаправить на предыдущую страницу после регистрации в Django

Для входа и выхода я использую встроенное представление 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 на основе классов вместо написания нового представления с нуля.


person Xiao Liang    schedule 16.03.2015    source источник


Ответы (1)


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

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

<form method="post">
    <p>
    {{form.as_p}}
    </p>
    <input type="submit" value="Regsitarte" /> 
</form>
person Community    schedule 16.03.2015
comment
Спасибо! На самом деле я использую метод JQuery .load () для загрузки моего файла registration.html на любую страницу, которую сейчас видит пользователь. Поэтому, если я оставлю поле «действие» пустым, он не сможет найти правильный URL-адрес, поскольку текущая страница может не быть страницей регистрации. Но вы меня вдохновляете. Я меняю "действие" на <form method="post" action="{% url 'accounts:registration' %}?next={{next}}" >. Тогда это решает мою проблему. Большое тебе спасибо! - person Xiao Liang; 17.03.2015