【问题标题】:Catch-all view break URL patterns in Django包罗万象的视图打破 Django 中的 URL 模式
【发布时间】:2021-07-13 19:08:49
【问题描述】:
def get_urls(self):
    urls = super().get_urls()
    url_patterns = [path("admin_profile", self.admin_view(self.profile_view))]
    return urls + url_patterns

上述方法导致包罗万象的视图破坏了我在管理 URL 之后路由的 URL 模式并导致以下错误/异常:

找不到页面 (404) 请求方法:GET 请求 网址:http://127.0.0.1:8000/admin/admin_profile/ 提出 作者:django.contrib.admin.sites.catch_all_view

但这只会发生在

final_catch_all_view = 真

django.contrib.admin.sites.catch_all_view

设置时

final_catch_all_view = 假

没有错误或异常发生,一切正常。

现在我的问题是如何让函数在什么时候起作用

final_catch_all_view = 真

这就是文档对 catch_all 视图的评价:

> The new admin catch-all view will break URL patterns routed after the
> admin URLs and matching the admin URL prefix. You can either adjust
> your URL ordering or, if necessary, set AdminSite.final_catch_all_view
> to False, disabling the catch-all view. See What’s new in Django 3.2
> for more details.

附加 url 的类:

from django.contrib import admin
from django.template.response import TemplateResponse
from django.urls import path


class BookrAdmin(admin.AdminSite):
    site_header = "Bookr Administration"
    logout_template = "admin/logout.html"

    def profile_view(self, request):
        request.current_app = self.name
        context = self.each_context(request)
        return TemplateResponse(request, "admin/admin_profile.html", context)

    def get_urls(self):
        urls = super().get_urls()
        url_patterns = [path("admin_profile", self.admin_view(self.profile_view))]
        return url_patterns + urls

urls.py:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from reviews import views

urlpatterns = [
    path('accounts/', include(('django.contrib.auth.urls', 'auth'), namespace='accounts')),
    path('accounts/profile/', views.profile, name='profile'),
    path('admin/', admin.site.urls),
    path('', include('reviews.urls')),
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

【问题讨论】:

  • 请包含您的 urls.py 文件、您为其附加 URL 的类以及注册 ModelAdmin 类的代码。
  • 包括在内;不确定 admin.py 代码在这里是否有帮助
  • 我想知道使用AdminSite.get_urls 是否有问题。尝试将其应用于配置文件的 ModelAdmin 子类 docs.djangoproject.com/en/3.2/ref/contrib/admin/… 而不是 AdminSite。如果可行,您可以向后确定您原来的方法出了什么问题。

标签: python django


【解决方案1】:

文档似乎表明您需要在 django 管理 URL 之前指定自定义 URL。在您的 get_urls 覆盖函数中,您添加而不是添加自定义 url。请尝试以下操作:

def get_urls(self):
    urls = super().get_urls()
    url_patterns = [path("admin_profile", self.admin_view(self.profile_view))]
    return url_patterns + urls

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 2011-08-12
    • 2013-01-13
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多