我正在尝试使url模式来从根目录捕获所有url。

我的主要urls.py是:

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


我在app1.urls中使用了两个网址格式:

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})


当我请求网址“ / first-post / my-first-post /”时,它将检出标题为“ my_url”下的“ model1”中的网址,并返回页面。

但是,当我请求网址“ / second-post / my-second-post /”时,它会检出“ model1”中的网址并抛出错误,因为该网址位于标头“ 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”用于具有两个主要类别“ car”和“ bike”的汽车,而“ model2”具有与“最新的汽车”和“最新的自行车”相同的名称。对于这些类别,我想从根目录中获取分别为“ / cars / lexus .....”,“ / bike / ducati ....”的网址。同样,可以进一步添加子文件夹url,并且所有url的产品ID均带有“。”。和数字。所以有什么办法可以使用上述网址格式为这两个模型选择网址frm根。

最佳答案

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

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

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

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

09-17 12:44