Django RedirectView со слагом в URL
Я собираюсь RedirectView
с Джанго, и я хотел бы знать, как я могу пройти пули в моем URL.
В моем веб-приложении Django пользователи могут установить один или несколько документов в корзину и открыть модальную страницу с личной информацией, прежде чем отправлять форму и получать электронное письмо с проверенными документами.
Этот URL в моем приложении выглядит следующим образом:
http://localhost:8000/freepub/home?DocumentChoice=<code>&DocumentSelected=Add+document
<code>
соответствует уникальному коду документа (например: PUBSD15-FR-PDF
или же PUBSD01-EN-EPUB
)
Но этот URL немного сложен, потому что его следует добавить в другое приложение.
Вот почему я использую RedirectView
чтобы упростить этот URL:
url(r'^freepub/direct/download/(?P<code>[\w\.-]+)/',
RedirectView.as_view(url="http://localhost:8000/freepub/home?DocumentChoice=(?P<code>[\w\.-]+)&DocumentSelected=Add+document"),
name='go-to-direct-download')
Выпуск:
Если я напишу в своем URL: http://localhost:8000/freepub/direct/download/PUBSD15-FR-PDF
Перенаправление это: http://localhost:8000/freepub/home?DocumentChoice=(?P<code>[%5Cw%5C.-]+)&DocumentSelected=Add+document
Как я мог принять во внимание code
в моем URL вместо (?P<code>[%5Cw%5C.-]+)
?
Спасибо
1 ответ
Вы можете подкласс RedirectView
для этого:
# app/views.py
from django.http import QueryDict
class MyRedirectView(RedirectView):
def get_redirect_url(self, *args, **kwargs):
q = QueryDict(mutable=True)
q['DocumentChoice'] = self.kwargs['code']
q['DocumentSelected'] = 'Add document'
return 'http://localhost:8000/freepub/home?{}'.format(q.urlencode())
а затем использовать его как:
url(
r'^freepub/direct/download/(?P<code>[\w\.-]+)/',
MyRedirectView.as_view(),
name='go-to-direct-download'
),
Однако было бы желательно получить URL перенаправления по имени представления, например, с помощью reverse
[Django-doc], поскольку теперь URL-адрес жестко задан, и если позднее вы развернете свое приложение или измените имя хоста, это приведет к неправильным перенаправлениям.
Кроме того, в Django обычно не передается много данных через параметры GET, поэтому, возможно, лучше создать представление и кодировать эту часть в пути URL-адреса, а не в строке запроса.