Подтвердить что ты не робот

"Следующий" параметр, перенаправление, django.contrib.auth.login

Я пытаюсь перенаправить пользователей на пользовательский url/gallery/(username)/"после успешного входа в систему. В настоящее время он перенаправляется на страницу по умолчанию /account/profile/. Пока я знаю, что могу переопределить URL-адрес перенаправления в моих settings.py, мой url динамический, поэтому он не будет работать.

В документации указано, что мне нужно использовать "следующий" параметр и контекстные процессоры. У меня есть {{next}} в моем шаблоне, но я смущен тем, как фактически передать "/gallery/(username)". Любая помощь будет принята с благодарностью.

p.s Я пытаюсь уклониться от написания собственного входа в систему.

4b9b3361

Ответ 1

Я признаюсь, что обычно использую 2 переадресации, чтобы заставить что-то подобное работать.

Сначала создайте собственную страницу registration/login.html. Вы можете скопировать и вставить пример html в этом разделе документов проверки подлинности, чтобы сделать процесс немного проще. Вместо использования динамической переменной '{{ next }} из контекста, однако, hardwire значение рядом с общим представлением посадки зарегистрированных пользователей

<input type="submit" value="login" />
<input type="hidden" name="next" value="/gallery/" />

Затем в представлении, которое вы сопоставляете с URL-адресом /gallery/, извлеките объект User из запроса (поскольку пользователь теперь будет зарегистрирован, особенно если просмотр галереи завернут в @permission_required или @login_required decorator. Используйте это представление для перенаправления на соответствующую страницу для конкретной страницы:

@login_required
def gallery(request):
    url = '/gallery/%s/' % request.user.username
    return HttpResponseRedirect(url)

Ответ 2

Django login view django.contrib.auth.views.login принимает словарь с именем extra_context. Значения в словаре напрямую передаются в шаблон. Поэтому вы можете использовать это для установки параметра next. Как только это будет сделано, вы можете установить скрытое поле с именем next и значением {{ next }}, чтобы оно отображалось в шаблоне.

Ответ 3

Если у вас уже есть пользовательский шаблон для формы входа в систему, вам нужно добавить следующее в свой тег <form>:

<input type="hidden" name="next" value="{{next}}" />

Кстати, вам не нужно создавать свой собственный логин. django.contrib.auth.views.login отлично работает. Вам нужно только создать для него шаблон (registration/login.html)

Ответ 4

будучи новичком в django и наткнувшись на этот несколько более старый поток, я нашел другое решение для проблемы динамически (= переопределить настраиваемый по умолчанию только при необходимости), устанавливая следующий параметр, который я бы хотел использовать (работала нормально с django 1.5, более ранние версии непроверены):

так же, как django-d, я хотел избежать повторения и пользовательского вида входа, поэтому я использовал запас django.contrib.auth.views.login -view, добавив строку

url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html',}, name='login'),

на мой urls.py и внутри элемента формы login.html-templates:

{% if not next or not next.strip %}
  {# avoid django.contrib.auth.views.login s default of /account/profile/ #}
  {% url 'afterlogindefaultview' as next %}
{% endif %}
<input type="hidden" name="next" value="{{ next }}" />

который, насколько я понимаю, следует за развязкой-практикой url-конфигураций из представлений. поэтому для просмотров, которые должны перенаправляться на вход в мои приложения, а затем переходить к представлению, отличному от значения по умолчанию Я использую

return HttpResponseRedirect('%s?next=%s' % (reverse('login'), reverse('mycustomnext')) )

из представления, где я хочу, чтобы пользователь заходил в систему. Я использую это, чтобы вернуться к представлению, где я остановился для входа пользователя в систему.

Ответ 5

Вы можете использовать статическое перенаправление на /loggedin/, а затем связать URL с представлением, которое делает правильную перенаправление.

Вход занимает дополнительный шаг, но если вы хотите использовать просмотр django, он выполняет задание.

Ответ 6

создайте собственное представление для входа в систему, с его собственным URL-адресом, не используйте администратор. вы можете сохранить следующую страницу в сеансе или передать ее как параметр GET в окно входа в систему (т.е./login? next = gallery) просто не забывайте санировать и проверять это значение перед перенаправлением на него.