Django RedirectView со слагом в URL - PullRequest
       47

Django RedirectView со слагом в URL

0 голосов
/ 31 октября 2018

Я получаю 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 Ответ

0 голосов
/ 31 октября 2018

Вы можете создать подкласс 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-адреса, а не в строке запроса.

...