如何从捕获URL模式“命名组”的Django中排除字符串

时间:2018-10-08 07:35:36

标签: python django python-3.x django-views

我正在尝试使用url模式来从根目录捕获所有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 /”时,它检出我的“ model1”头中的“ my_url”下的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”用于具有两个主要类别“ car”和“ bike”的汽车,而“ model2”具有与“最新的汽车”和“最新的自行车”相同的名称。对于这些类别,我想从根目录中获取分别为“ / cars / lexus .....”,“ / bike / ducati ....”的URL。同样,可以进一步添加子文件夹url,并且所有url的产品ID均带有“。”。和数字。那么有什么方法可以使用上述网址格式为这两个模型选择网址frm根。

1 个答案:

答案 0 :(得分:2)

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

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

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

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