Уведомления

Группа в Telegram: @pythonsu

#1 Май 5, 2014 23:05:15

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

Пользователь через форму отправляет запрос на серер. Ссылки такие:

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

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

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

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

PS
Сильно не пинайте, только начал изучать django.



—-
memento mori

Офлайн

#2 Май 6, 2014 05:49:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

Надо средиректить на другой урл c параметрами в гете,

return HttpResponseRedirect("main/registration/reg/?error=ERROR")



Офлайн

#3 Май 6, 2014 08:42:40

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

FishHook
Надо средиректить на другой урл c параметрами в гете,
HttpResponseRedirect конечно однозначно бросает куда надо. Думал об этом, но это как-то не красиво… Нагуглил что можно этим делом управлять с помощью javascript (проверять значения перед отправкой)… Надо будет на досуге попробовать.



—-
memento mori

Офлайн

#4 Май 6, 2014 13:25:49

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

Подскажите еще как в 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'))



—-
memento mori

Офлайн

#5 Май 6, 2014 17:02:54

pythonlove
Зарегистрирован: 2014-04-22
Сообщения: 16
Репутация: +  4  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

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

Отредактировано pythonlove (Май 6, 2014 17:17:14)

Офлайн

#6 Май 6, 2014 18:41:16

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

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

PS
Если подскажите как передать использую пример с HttpResponseRedirect (использую чтоб URL сменился), буду признателен вдвойне.



—-
memento mori

Офлайн

#7 Май 6, 2014 20:38:26

pythonlove
Зарегистрирован: 2014-04-22
Сообщения: 16
Репутация: +  4  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

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

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

А все же, почему вам так сильно нужно, чтобы у пользователя менялся урл после неудачной отправки формы, и почему вы не используете django.forms для валидации данных?

Отредактировано pythonlove (Май 6, 2014 20:41:11)

Офлайн

#8 Май 6, 2014 21:46:57

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

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

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

Вариант с render просто. И форму регистрации показать и просто передать ошибку. Но все портит урл ))



—-
memento mori

Офлайн

#9 Май 6, 2014 22:12:27

pythonlove
Зарегистрирован: 2014-04-22
Сообщения: 16
Репутация: +  4  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

Обычно в таких случаях форму обрабатывают в той же самой вьюхе, которая выводит ее пользователю. Как в этом примере. Если сделать так же, тогда с вашим урлом все нормально будет.

Отредактировано pythonlove (Май 6, 2014 22:14:49)

Офлайн

#10 Май 7, 2014 09:13:28

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Как поменять URL в адресной строке

Как раз по доке, что указали, сделал себе contact. Только пока одна проблема: как мне добавить свой стиль к такому выводу?? Вот код:

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

Как применить свой стиль к form.subject, указать класс? Бегло посмотрел документацию по шаблонам, но не увидел ответа.



—-
memento mori

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version