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中的分类上。
这个代码的问题。
当在管理站点中添加一个新的分类时,Django项目必须重新启动(至少在内置的开发服务器上)。
当我上次用python manage.py做makemigrations的时候,它就爆炸了。我不得不注释掉任何与_get_categories_url_pattern有关的内容。然后它就进行了迁移。现在我再也不能重现这个错误了。但是这段代码中似乎存在一些危险。
你能不能帮我理解如何重构这段代码,让它在添加新的分类时至少不用重启开发服务器。
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匹配。