Передача данных модели в urlpatterns в urls.py Джанго - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь написать общую запись urlpatterns в urls.py , которая заменит жестко закодированные записи, как показано ниже:

path('apple/', RedirectView.as_view(url='/apple/abc/'), name='apple_redirect'),
path('orange/', RedirectView.as_view(url='/orange/def/'), name='orange_redirect'),
path('banana/', RedirectView.as_view(url='/banana/ghi/'), name='banana_redirect'),  

Модель под названием fruits содержит следующие данные:

    name = 'apple'
    url = 'apple/abc/'

    name = 'orange'
    url = '/orange/def/'

    name = 'banana'
    url = '/banana/ghi/'

Я бы хотел избежать необходимости ручного добавления другого пути в случае добавления новой записи в модель fruits .

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Если вы хотите использовать RedirectView, вы можете создать его подкласс и переопределить get_redirect_url.

class FruitRedirectView(RedirectView):
    def get_redirect_url(self):
        fruit = get_object_or_404(Fruit, name=self.kwargs['fruit'])
        return fruit.url

Затем замените ваши индивидуальные шаблоны URL фруктов на:

path('<slug:fruit>/', FruitRedirectView.as_view(), name='fruit_redirect'),

Обратите внимание, что вам не нужно использовать RedirectView здесь. Взгляд Алекса С. легче понять, особенно если вы не знакомы с общими взглядами Джанго.

Обратите внимание, что после добавления <slug:fruit>/ представление вызовет ошибку 404 для всех фруктов, которых нет в базе данных. Это немного отличается от того, когда у вас были apple/ и orange/ в ваших шаблонах URL-адресов - в этом случае Django сможет сопоставить шаблон дальше по вашему списку шаблонов URL-адресов.

0 голосов
/ 08 января 2019

Вы должны поймать URL-параметр и передать его на ваш вид, как это

from django.shortcuts import redirect, get_object_or_404

def fruit_redirect_view(request, url_path):
    fruit = get_object_or_404(Fruit, name=url_path)
    return redirect(fruit.url)

Таким образом, если фрукт с таким именем существует, запрос будет перенаправлен на URL-адрес фрукта, в противном случае возникнет ошибка 404

...