Django redirectview со слагом в url-адресе

Я получаю RedirectView с Django, и я хотел бы знать, как я могу передать слаг в моем 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
275
1
Перейти к ответу Данный вопрос помечен как решенный

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

Я попробую ваше решение, а затем отредактирую свой код, чтобы изменить параметры GET на POST, верно? В любом случае спасибо за ваш ответ, и я вернусь, если он сработает или нет;)

Essex 31.10.2018 14:08

@Ducky: обычно используется только путь, как здесь с URL-адресом. Параметры POST обычно используются для форм.

Willem Van Onsem 31.10.2018 14:10

Считаете ли вы, что это плохой способ проследить мой процесс с вашим ответом? Ваш ответ работает нормально!

Essex 31.10.2018 14:14

@Ducky: нет, не само по себе, это скорее немного "ООН-django", что само по себе не является большой проблемой. Единственная проблема, которая может возникнуть из-за этого, заключается в том, что не все библиотеки и т. д. Предназначены для этого. Но это не «прямая» проблема.

Willem Van Onsem 31.10.2018 14:17

Хорошо, большое спасибо за вашу помощь! Как всегда, это отличный ответ, и теперь мое приложение отлично работает в этом вопросе. Спасибо !

Essex 31.10.2018 14:21

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