Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当一个类别包含在URL中时,Django URL模式_Django_Django Urls - Fatal编程技术网

当一个类别包含在URL中时,Django URL模式

当一个类别包含在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'

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()
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中的类别上

此代码的问题:

  • 当在管理站点中添加新类别时,Django项目 重新启动(至少使用内置的dev服务器)

  • 上次我做python manage.py makemigrations时,它崩溃了。我 必须对任何与此有关的事情进行评论 _获取\u类别\u url\u模式。然后它进行了迁移。现在我再也不能重现这个错误了。但在这段代码中似乎有一些危险


  • 您能否帮助我了解如何重构此代码,使其在添加新类别时至少不必重新启动开发服务器即可正常工作。

    服务器启动时加载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)
        ...