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-адреса, а не в строке запроса.

Другие вопросы по тегам