【问题标题】:django urls.py: two modules with similar pathsdjango urls.py:两个具有相似路径的模块
【发布时间】:2020-09-19 22:48:43
【问题描述】:

我的 django 应用中有两个模块,比如说catsdogs,我想要这样的网址:

  • /fluffy/meow.html - Fluffy 是猫的名字
  • /fluffy/eat.html
  • /jackie/bark.html - Jackie 是条狗
  • /jackie/eat.html - 与猫模块中的名称相同

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

如果我这样写urls.py

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

请求/jackie/eat.html 将被cats 捕获 模块,但是没有名字为jackie的猫,所以它会给出404错误。是否可以让 django 检查另一个 url 路径而不是得到 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


【解决方案1】:

没有。更改您的逻辑,而不是硬编码 url 并在 Urls 中搜索。 首先对您的猫和狗网址进行分类,然后在 db 中搜索以将它们显示为网址。

【讨论】:

    【解决方案2】:

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

    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"),
    ]
    

    在你的意见中.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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 2018-12-28
      • 1970-01-01
      • 2019-10-09
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多