我正尝试在 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 模型中的新条目,我希望避免手动添加其他路径。
答案 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模式列表中进一步匹配模式。