Найти - Пользователи
Полная версия: Как поменять URL в адресной строке
Начало » Django » Как поменять URL в адресной строке
1 2
k0st1an
Пользователь через форму отправляет запрос на серер. Ссылки такие:

site.ru/main/registration/ -> site.ru/main/registration/email

Во вьюхе (email) проверяется правильно ли он вбил данные. Если нет, то через:

return render(request, 'main/reg.html', {'error': 'ERROR'})

его бросает обратно. Но в адресной строке остается, уже, старый адрес (…/email). Как можно перекинуть, обновив адрес, и передать словарь?

PS
Сильно не пинайте, только начал изучать django.
FishHook
Надо средиректить на другой урл c параметрами в гете,
return HttpResponseRedirect("main/registration/reg/?error=ERROR")
k0st1an
FishHook
Надо средиректить на другой урл c параметрами в гете,
HttpResponseRedirect конечно однозначно бросает куда надо. Думал об этом, но это как-то не красиво… Нагуглил что можно этим делом управлять с помощью javascript (проверять значения перед отправкой)… Надо будет на досуге попробовать.
k0st1an
Подскажите еще как в template GET прочитать?

А ссылку (вид вот такой: main/registration/?errcode=1) в итоге гинерю вот так:

import urllib
def url_gen(path, **kwargs):
    return path + '?' + urllib.urlencode(kwargs)
def email(request):
    errcode = None
    if request.POST['email'] != request.POST['email_again']:
        errcode = 1
    elif request.POST['password'] != request.POST['password_again']:
        errcode = 2
    if isinstance(errcode, int):
        url = url_gen(reverse('main:reg'), errcode=errcode)
        return HttpResponseRedirect(url)
    return HttpResponseRedirect(reverse('main:index'))
pythonlove
Вы можете передать нужное вам значение через вьюху. Ессли вам этого покажется недостаточно, то в settings придется подключить django.core.context_processors.request.

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS += (
    'django.core.context_processors.request',
)

После этого request становится доступен в темплейтах. Получать из GET значения можно так:

request.GET.error
k0st1an
pythonlove
Cпасибо! Я как раз уже нашел подобное. С передачей через вьюху у меня пока сплошные проблемы Но дело движется! Думаю воспользуюсь вторым вариантом.

PS
Если подскажите как передать использую пример с HttpResponseRedirect (использую чтоб URL сменился), буду признателен вдвойне.
pythonlove
Возможно, вы меня неправильно поняли, я ничего особенного не имел в виду ) Вы же куда-то редиректите пользователя, и затем какая-то вьюха рендерит темплейт, в котором вам нужно получить значение, передающееся через GET. И вот из нее вы можете передавать в темплейт что угодно.

return render(request, 'main/reg.html', {
    'error': request.GET.get('error')
})

А все же, почему вам так сильно нужно, чтобы у пользователя менялся урл после неудачной отправки формы, и почему вы не используете django.forms для валидации данных?
k0st1an
О Forms я как раз узнал. Вообще это регистрация пользователя. Когда он что-то неверно внесёт его должно кинуть обратно и над формой написать, что конкретно он внёс неверно. И, как бы, логично если у пользователя будет не новый урл (где ему сообщается, что он среди счастливчиков), а старый (main/registration/). Форму можно заполнить данными, что ранее вносил пользователь, как я думаю, через Forms, убрав кривые данные.

Вроде с Forms все ясно, но надо тестить. Сходу не понял, что мне с нее взять. С пользователя я буру только мыло и пароль, и оба в двух экземплярах, потом проверяю, что совпадает и тогда буду записывать в базу (еще нужно письмо отправить…).

Вариант с render просто. И форму регистрации показать и просто передать ошибку. Но все портит урл ))
pythonlove
Обычно в таких случаях форму обрабатывают в той же самой вьюхе, которая выводит ее пользователю. Как в этом примере. Если сделать так же, тогда с вашим урлом все нормально будет.
k0st1an
Как раз по доке, что указали, сделал себе contact. Только пока одна проблема: как мне добавить свой стиль к такому выводу?? Вот код:

<tr>
  <td class="right"><label for="id_subject">*Subject:</label></td>
  <td>{{ form.subject }}</td>
</tr>

Как применить свой стиль к form.subject, указать класс? Бегло посмотрел документацию по шаблонам, но не увидел ответа.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB