django urls.py:两个具有相似路径的模块

问题描述 投票:0回答:2

我的django应用程序中有两个模块,比方说catsdogs,并且我想要这样的网址:

  • [/fluffy/meow.html-蓬松是猫的名字]
  • /fluffy/eat.html
  • [/jackie/bark.html-杰基是狗]
  • /jackie/eat.html-与cats模块中的名称相同

会有很多不同的猫和狗,但是可以保证,猫和狗的名字不能相同。

如果我这样制作urls.py

urlpatterns += [
    path('<slug:cat_name>/', include('cats.urls')),
    path('<slug:dog_name>/', include('dogs.urls')),
]

请求/jackie/eat.html将被cats捕获模块,但没有名称为jackie的猫,因此会出现404错误。是否可以让django检查其他网址路径,而不是收到404错误?


我知道,我可以使用此urls.py

urlpatterns += [
    path('cats/<slug:cat_name>/', include('cats.urls')),
    path('dogs/<slug:dog_name>/', include('dogs.urls')),
]

但是我不想要


大约有1000只猫的名字,而且它并不经常更改,所以我可以用巨大的re_path硬编码猫的名字,但我希望有更好的解决方案

urlpatterns += [
    re_path(r'^(?P<cat_name>fluffy|simon|thomas|etc..)/$', include('cats.urls')),
    path('<slug:dog_name>/', include('dogs.urls')),
]
django django-urls
2个回答
0
投票

没有更改您的逻辑,而不是硬性填写URL和在Urls中搜索。首先将猫和狗的网址分类,然后在db中搜索以将其显示为网址。


0
投票

首先,创建一个模型名称动物,它包含

1. Category - Dog or cat
2. Name - animal name
3. ... if u want any values, add it here

例如:

from django.db import models

class Animal(models.Model):
    ANIMAL_CHOICES= (
        ('cat', 'cat'),
        ('dog', 'dog'),
    )
    category = models.CharField(max_length=1, choices=ANIMAL_CHOICES)
    name = models.CharField(max_length=30)

然后在您的urls.py中

urlpatterns += [
    path('cats/<slug:cat_name>/', cat, name="cats"),
    path('dogs/<slug:dog_name>/', dog, name="dogs"),
]

在您的views.py

def cat(request, cat_name):
    cat = Animals.objects.filter(category="cat", name=cat_name)
    context = { cat: cat }
    return render(request, "template_name.html", context=context)

def dog(request, dog_name):
    cat = Animals.objects.filter(category="dog", name=dog_name)
    context = { dog: dog }
    return render(request, "template_name.html", context=context)
© www.soinside.com 2019 - 2024. All rights reserved.