当一个类别包含在URL中时,Django URL模式
Django 3.0.6当一个类别包含在URL中时,Django URL模式,django,django-urls,Django,Django Urls,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'
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()
urlpatterns=[
路径(“”,HomeView.as_view(),name='home'),
路径({}.format(“admin/”如果DEBUG-else“dhjfsljdasdhje32/”),admin.site.url),#出于安全原因更改管理员url。
路径('image/',包括('image.url','image'),namespace=“image”),
路径('polls/',包括(('polls.url','polls'),namespace=“polls”),
路径('applications/',包括(('applications.url','applications'),namespace=“applications”),
]
def_get_categories_url_pattern():
"""
使用帖子类别组织URL。
URL格式:
/
示例:linux/如何安装ubuntu/
"""
categories=Category.objects.all().values\u list(“slug”,flat=True)
对于类别中的类别:
append(路径('{}/'.format(category),include('post.url'))
append(路径('draft/{}/'.format(category),include('post.url'))
_获取\u类别\u url\u模式()
请把注意力集中在如何处理URL中的类别上
此代码的问题:
您能否帮助我了解如何重构此代码,使其在添加新类别时至少不必重新启动开发服务器即可正常工作。服务器启动时加载URL,因此您应该避免在那里进行数据库查询 为新数据库运行
migrate
时,代码将给出错误,因为尚未创建类别表。完成第一次迁移后,代码将正常运行,但正如您所注意到的,URL不会随着新类别的添加而更新
通常的方法是在URL模式中添加slug
kwarg
path('applications/', include(('applications.urls', 'applications'), namespace="applications")),
path('<slug:slug>', include('post.urls')),
path('draft/<slug:slug>', include('post.urls')),
这样做的一个问题是/
将匹配其他URL,例如/image/
或/polls/
。在上面的代码中,我将
放在URL模式的底部,从而避免了这个问题。另一种选择是使用类似于categories/
的内容,以便它与其他URL不匹配
from django.shortcuts import get_object_or_404
def category_view(request, slug):
category = get_object_or_404(Category, slug=slug)
...