我的django应用程序中有两个模块,比方说cats
和dogs
,并且我想要这样的网址:
/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')),
]
没有更改您的逻辑,而不是硬性填写URL和在Urls中搜索。首先将猫和狗的网址分类,然后在db中搜索以将其显示为网址。
首先,创建一个模型名称动物,它包含
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)