无法创建自定义管理模板 url,出现错误模板错误和创建自定义管理站点错误

Posted

技术标签:

【中文标题】无法创建自定义管理模板 url,出现错误模板错误和创建自定义管理站点错误【英文标题】:Unable to create a custom admin template url, getting errors Template errors & creating custom admin site errors 【发布时间】:2020-06-17 06:38:30 【问题描述】:

我正在使用这个博客: https://medium.com/@adriennedomingus/adding-custom-views-or-templates-to-django-admin-740640cc6d42

无法在 Django Admin 中创建自定义模板视图。我收到django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet

如果我在 settings.py 中注释掉该应用程序,我会收到错误 admin.site.register(Template, TemplateAdmin) NameError: name 'Template' is not defined

如果我从 django.templates 导入模板,我会得到 TypeError: 'type' object is not iterable

无法做到: 1) custom_admin_site.register & 2) models.Template 没有找到。表示模型中没有模板。

我在 admin.py 上有这个:

from django.contrib import admin
from django.db import models
from django.templates import Template
class TemplateAdmin(admin.ModelAdmin):
    change_form_template = ‘admin/test_attempt.html’

admin.site.register(Template, TemplateAdmin)

如果我在 CustomAdminSite 注册,则会收到 register for model in model_or_iterable: TypeError: 'MediaDefiningClass' object is not iterable 错误:

CustomAdminSite.register(Template, TemplateAdmin)

# Even the following doesnot work
# custom_site_admin.register(Template, TemplateAdmin)

我在views.py上有这个:

from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader

def preview(self, request, object_id):
    context = 

    context = 
        **self.each_context(request),
        'title': self.index_title,
        # Unable to get this app_list as well
        # 'app_list': app_list,
    

    request.current_app = self.name
    #load_template = request.path.split('/')[-1]
    #template = loader.get_template('admin/' + load_template)
    template = loader.get_template('admin/test_attempt.html')
    return HttpResponse(template.render(context, request))

我在 urls.py 上有这个:

from .views import preview

class CustomAdminSite(admin.AdminSite):
    def get_urls(self):
    urls = super(CustomAdminSite, self).get_urls()
    custom_urls = [
        path(r’^admin/test/(?P<object_id>\d+)$’, self.admin_view(preview), name=”preview”),
    ]
    return urls + custom_urls

我的 apps.py 上有这个:

class CustomAdminSiteConfig(AdminConfig):
    default_site = 'batchexits.admin.CustomAdminSite'

我已经在我的 settings.py 注册应用中添加了这个:

'batchexits.admin.CustomAdminSiteConfig',

我读过这个: how to fix django admin "You don't have permission to view or edit anything."?

感谢任何帮助以使这项工作正常进行。

【问题讨论】:

django.templates.Template 是什么?那是 Django 模型吗? 我什至在源代码中都找不到对django.templates.Template 的引用。此外, admin.site.register(...) 函数应该将模型类作为第一个参数,在你的情况下它不是 欢迎任何参考。即使我可以在 API 中找到模板。我已经看过 django 源代码,并且确定它不起作用。这个概念太神秘了。周围没有博客。现在看起来像一个没有任何文档的大象任务。 Arakkal Abu,第二个问题是 django 文档说它有效。所以我知道它会 from django.templates import Template 你想在这里导入什么?通常admin.site.register(Template, TemplateAdmin) 中的“模板”应该是模型类 【参考方案1】:

我不能 100% 确定您要做什么,但看起来您希望在标准 django 管理员中为特定模型添加自定义视图。如果是这种情况,您可以不理会AdminSite,您可能根本不需要自定义它。我已经将您的代码重新排列了一下,更像是它需要的东西。我没有解决所有问题,因为我不确定你想要什么,所以不要复制和粘贴这个,但我会解释相关的部分,希望能让你指向正确的方向。

您无需在settings.py 中向您的应用添加任何内容。管理员 django.contrib.admin 并希望我们已经列出了您的应用程序(如果没有,您需要先添加它,然后添加您的模型,然后再考虑为它们添加管理界面)。

class TemplateAdmin(admin.ModelAdmin):
    change_form_template = ‘admin/test_attempt.html’   # 1

    def get_urls(self):  # 2
        urls = super().get_urls()
        admin_site = self.admin_site
        custom_urls = [
            path(
                r’^(?P<object_id>\d+)/test/$’,
                self.admin_view(self.preview),        # 3
                name="preview"),              
        ]
        return urls + custom_urls

    def preview(self, request, object_id): # 4 
        context = 

        context = 
            **self.each_context(request),
            'title': self.index_title,
            # Unable to get this app_list as well
            # 'app_list': app_list,
        

        request.current_app = self.name
        #load_template = request.path.split('/')[-1]
        #template = loader.get_template('admin/' + load_template)
        template = loader.get_template('admin/test_attempt.html') # 4
        return HttpResponse(template.render(context, request))


admin.site.register(Template, TemplateAdmin)  # 5

# 1

当您单击以检查或更改(或为此添加)您拥有的模型的特定实例时,将使用此模板。如果您要获得新视图的链接,则需要更改此模板并将链接添加到您在 # 3 定义的任何 url。顺便说一句,如果您只想自定义此视图,则可以忽略其他所有内容,只需将所需内容添加到该模板即可。

# 2

您需要了解为什么我们必须使用get_urls。通常要返回一个特定的视图,你在urls.py 中设置一些东西,它将指向你拥有的一个特定的视图(通常定义在views.py 之类的地方)。但是我们想要添加一个admin 视图,并且所有以admin/... 开头的网址都在管理应用程序中处理。为了解决这个问题,django 在ModelAdmin 中为我们提供了get_urls 方法,因此我们可以添加额外的视图。

# 3

self.admin_view() 只是添加了一些关于授权的额外逻辑,所以我们不必担心。注意在上面一行中,我们只需要添加 url 的结尾部分,所以完整的 url 将是 admin/app/model//test

# 4

这是我们定义您的额外视图的地方,将视图添加为此 ModelAdmin 的方法是有意义的,因为它与它直接相关。

# 5

在您所遵循的教程中,作者必须有一些名为 Template 的模型(这对于模型来说可能是一个非常令人困惑的名称),并且您需要将 Template 替换为您为其创建此视图的任何模型)。将TemplateAdmin 重命名为更合适的名称也很有意义(如果您的模型称为Car,则将其称为CarAdmin)。

我希望这会有所帮助。

编辑:按照您在下面评论中添加的链接,我猜您正在尝试完成此处概述的任务:https://github.com/ganeshkbhat/pr/blob/master/admintmpl/admin.py。即:

# TASK:
# need custom admin template inside admin that shows
#       all questions assigned to user
#       filter option sort by user

# TASK:
# Create test template which shows inside admin
#       1. question
#           - INLINE options - 2 answers (4 options max)
#       2. question
#           - INLINE options - 2 answers (4 options max)
#       Submit
# On submit save to QuestionsAnswered

这些任务都可以在没有任何非常自定义的情况下完成,绝对不是您一直遵循的教程中需要的那种东西。我不会在这里全部回答,因为它远远超出了这个问题的要求。但我建议您在这里查看 django 文档:https://docs.djangoproject.com/en/dev/ref/contrib/admin/ 他们提供了关于如何做所有您需要的事情的解释。

【讨论】:

我能知道这是谁吗?这是一个需要时间的回复。 self.admin_view() 这个 api 允许我们为管理站点创建一个新视图还是在站点外部?如果它在站点之外,您是否希望我在模板行中添加身份验证其他管理模板身份验证或扩展任何模板或需要经过身份验证的模板,因为如果在管理应用程序外部创建的 url 可以直接访问? 其次,如果我需要管理员中的仪表板访问此链接以及查看/编辑选项,我是否需要自定义模板。那是我应该做的吗?或者,如果我为扩展+修改的列表视图管理模板的列表视图添加重定向语句,则重定向应该是自动的。 流程是管理仪表板(有表单链接)> 单击此链接 > 转到表单 > 用来自不同模型的数据填写表单或基于提交操作的 ListView。 这个流程是否在 django admin 之外创建了注册的管理模板,需要根据上述答案进行身份验证,或者我需要像 django 创建的应用程序这样的用户身份验证?我知道我可以扩展管理员基本模板,但不确定这是否适用于身份验证。我还没有尝试你的答案。刚看到你的回复【参考方案2】:

即使是经验丰富的 Django 开发人员,您所指的博客也会感到困惑。它的代码 sn-ps 非常小,因此您显然对丢失的代码位完全感到困惑。例如

    您添加的这一行不正确:from django.templates import Template # THIS IS WRONG!

Template 这是博客作者创建的“模型”类(它也不是模型的好名字——它太笼统了)。所以基本上你的models.py中会有这样的东西:

from django.db import models

class Template(models.Model):
    some_model_field = models.CharField()
    ...

然后您可以在您的管理员中执行from .models import Template

    博文中关于CustomAdminSite 的部分对于创建自定义模板并不是必不可少的,只会让您感到困惑。

    无论如何,您必须在 settings.py 中列出 INSTALLED_APPS 下的应用程序。你不能从那里删除它们。

    您还混淆了命名法:模板和 (Django) 应用程序是完全不同的概念。无论您是自定义 Django Admin 还是自定义网页,模板和视图的想法都是相同的。 Django Admin 只是 Django 提供的一个自定义帮助站点。您绝对可以自定义 Django Admin,而不必在 Django Admin 外部创建自定义网页。但是,您必须在 Django Admin 架构中工作。

Here 是一篇更好的博客文章,可能与您正在做的事情有些相关。我建议您撤消所做的事情并重新开始。

【讨论】:

【参考方案3】:

admin.site.register() 的第一个参数应该是一个模型类

我认为这段代码对你有用

@admin.register(yourmodelclass)
class yourmodelclassAdmin(ModelAdmin):
   change_list_template = 'admin/test_attempt.html'

【讨论】:

我试过这个。对我不起作用。我也有网上的。那会有影响吗?令人惊讶的是,一对多的关系根本不起作用。别管我在做模板时遇到的内联 github.com/ganeshkbhat/pr/blob/master/admintmpl/models.py 是我正在使用的。

以上是关于无法创建自定义管理模板 url,出现错误模板错误和创建自定义管理站点错误的主要内容,如果未能解决你的问题,请参考以下文章

Django 自定义 500 错误模板不显示 request.user

Django 自定义过滤器错误。返回“无效过滤器”

Django 1.8 没有使用我的自定义登录页面

错误多个指令 [bar, bar] 在使用自定义指令和 angular-bootstrap 时要求模板

加载自定义模板标签时出现问题(错误:没有名为 x 的模块)

构建 Vue 项目时出现错误“无法安装组件:未定义模板或渲染函数”