将模型数据传递到Django的urls.py中的urlpatterns

时间:2019-01-07 21:43:39

标签: django django-urls

我正尝试在 urls.py 中编写一个通用的 urlpatterns 条目,以替换硬编码的条目,如下所示:

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'),  

名为水果的模型包含以下数据:

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

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

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

如果要添加 fruits 模型中的新条目,我希望避免手动添加其他路径。

2 个答案:

答案 0 :(得分:2)

您应该捕获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错误

答案 1 :(得分:1)

如果要使用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

然后将您的单个水果网址格式替换为:

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

请注意,您无需在此处使用RedirectView。 Alex C的视图更容易理解,特别是如果您不熟悉Django的通用视图。

请注意,一旦添加了<slug:fruit>/,该视图将针对不在数据库中的所有水果引发404错误。这与您在URL模式中使用apple/orange/时稍有不同-在这种情况下,Django可能能够在URL模式列表中进一步匹配模式。