当一个类别被包含到URL中时,Django的urlpatterns。

问题描述 投票:1回答:1

Django 3.0.6

urlpatterns = [
    path('', HomeView.as_view(), name='home'),
    path('{}'.format("admin/" if DEBUG else "dhjfsljdasdhje32/"), admin.site.urls), # Change admin url for security reasons.
    path('image/', include(('image.urls', 'image'), namespace="image")),
    path('polls/', include(('polls.urls', 'polls'), namespace="polls")),
    path('applications/', include(('applications.urls', 'applications'), namespace="applications")),
]

def _get_categories_url_pattern():
    """
    Organize urls with posts categories.
    URL format:
    <category>/<post_slug>
    Example: linux/how_to_install_ubuntu/
    """
    categories = Category.objects.all().values_list("slug", flat=True)
    for category in categories:
        urlpatterns.append(path('{}/'.format(category), include('post.urls')))
        urlpatterns.append(path('draft/{}/'.format(category), include('post.urls')))

_get_categories_url_pattern()

请大家把注意力集中在如何处理urls中的分类上。

这个代码的问题。

  1. 当在管理站点中添加一个新的分类时,Django项目必须重新启动(至少在内置的开发服务器上)。

  2. 当我上次用python manage.py做makemigrations的时候,它就爆炸了。我不得不注释掉任何与_get_categories_url_pattern有关的内容。然后它就进行了迁移。现在我再也不能重现这个错误了。但是这段代码中似乎存在一些危险。

你能不能帮我理解如何重构这段代码,让它在添加新的分类时至少不用重启开发服务器。

django django-urls
1个回答
1
投票

urls是在服务器启动时加载的,所以你应该避免在那里做数据库查询。

当你运行 migrate 对于一个新的数据库,你的代码会给出错误,因为分类表还没有被创建。一旦你做了第一次迁移,代码就会无误地运行,但正如你所注意到的,URLs不会随着新类别的添加而更新。

正常的方法是在URL中添加一个 slug kwarg到URL模式。

path('applications/', include(('applications.urls', 'applications'), namespace="applications")),
path('<slug:slug>', include('post.urls')),
path('draft/<slug:slug>', include('post.urls')),

然后在视图中,使用 get_object_or_404 以确保该类别的存在。

from django.shortcuts import get_object_or_404

def category_view(request, slug):
    category = get_object_or_404(Category, slug=slug)
    ...

这方面的一个问题是 <slug:slug>/ 将与其他URL相匹配,如 /image//polls/. 在上面的代码中,我通过将 <slug:slug> 在URL模式的底部。另一个选择是使用类似 categories/<slug:slug>/ 以便不与其他URL匹配。

© www.soinside.com 2019 - 2024. All rights reserved.