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

Passing model data to urlpatterns in Django's urls.py

我正在尝试在 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'),  

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

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

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

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

我想避免在 fruits 模型中添加新条目时手动添加另一条路径的需要。

你应该像这样捕捉 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错误

如果你想使用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。 Alex C 的视图更容易理解,特别是如果您不熟悉 Django 的通用视图。

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