首页 > 解决方案 > 如何从捕获 url 模式“命名组”Django 中排除字符串

问题描述

我正在尝试制作 urls 模式以从 root 捕获所有 url。

我的主要 urls.py 是:

path('', (include('myapp.urls', namespace='app1')

我在 app1.urls 中使用了两个 url 模式:

re_path(r'^(?P<url_var1>[-\w./]+)/$', DetailView1.as_view(), name='DetailView1'),
re_path(r'^(?P<url_var2>[-\w./]+)/$', DetailView2.as_view(), name='DetailView2'),

我的 views.py 文件如下:

class DetailView1(View):
    template_name = 'detail.html'
    def get(self, request, url_var1):
        obj1 = model1.objects.get(my_url=url_var1)
        return render(request, self.template_name, {'obj1':obj1})

class DetailView2(View):
    template_name = 'detail.html'
    def get(self, request, url_var2):
        obj2 = model2.objects.get(my_url=url_var2)
        return render(request, self.template_name, {'obj2':obj2})

当我请求 url“/first-post/my-first-post/”时,它会在标题“my_url”下检查我的“model1”中的 url 并返回页面。

但是当我请求 url "/second-post/my-second-post/" 时,它会检查 "model1" 中的 url 并引发错误,因为 url 在标题 "my_url" 下的 "model2" 中。

我知道 urlpattern 遵循序列检查,并在与第一个 urlpattern(DetailView1)匹配的模式处停止,这就是它给我这个错误的原因。

我想知道有没有办法可以覆盖 urlpattern 的这种行为。

当在 DetailView1 中找不到 url 时,我也尝试过反向:

try:
    obj1 = model1.objects.get(my_url=url_var1)
except:
    return reverse('app1:DetailView2')

但它仍然给我一个错误。

如果你们中的任何人有任何其他关于从根中捕获 urlpattern 的建议,而不是两种类型的 urlpattern,请告诉我。

我正在制作一个产品兼博客网站,它有两个模型“model1”是产品模型,“model2”是博客模型。现在,“model1”适用于具有 2 个主要类别“car”和“bike”的汽车,“model2”与“latest in cars”和“latest in bikes”具有相同的含义。对于这些类别,我想从根目录中获取 URL,这些 URL 被指定为“/cars/lexus.....”、“/bike/ducati ....”。此外,还可以进一步添加子文件夹 url,并且所有 url 的产品 ID 都带有“.”。和数字。那么有没有办法我可以使用上面的 url 模式为两个模型选择 url frm root。

标签: pythondjangopython-3.xdjango-views

解决方案


在 Django 中不可能有多个视图和单个 urlpattern。

看看你的看法。它们几乎相同。您应该将处理不同 url 参数的逻辑放在单个视图中。

我的建议也是仔细检查您的模型设计,看起来您有两个基本相同的模型。我觉得这是你问题的根源。

此外,我假设您正在尝试创建某种博客。Django 最初是作为为新闻网站提供支持的框架。它有一些有用的工具。例如看看SlugField这可能会为您提供您正在寻找的功能。不会过度复杂化 urlpatterns。


推荐阅读