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

时间:2020-03-04 17:32:04

标签: django django-templates django-admin

我正在使用此博客: 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)没有找到模型。说模型中没有模板。

我在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."?

感谢您提供帮助以使该工作正常进行。

3 个答案:

答案 0 :(得分:4)

我不确定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/...开始的URL都在管理应用程序内处理。为了解决这个问题,django在get_urls中为我们提供了ModelAdmin方法,因此我们可以添加其他视图。

# 3

self.admin_view()仅添加了一些有关授权的附加逻辑,因此我们不必为此担心。请注意,在上面的一行中,我们只需要添加网址的结尾部分,因此完整网址将为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/他们对如何完成所需的所有事情提供了解释。

答案 1 :(得分:2)

即使您是经验丰富的Django开发人员,您所引用的博客也会使您感到困惑。它的代码片段很小,因此您显然对丢失的代码位感到困惑。例如

  1. 您添加的这一行有误: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

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

  2. 无论如何,您都必须在settings.py中的INSTALLED_APPS下列出应用。您无法从那里删除它们。

  3. 您还会混淆术语:模板和(Django)应用程序是完全不同的概念。无论您是自定义Django Admin还是自定义网页,模板和视图的想法都是相同的。 Django Admin只是Django提供的自定义帮助站点。您绝对可以自定义Django Admin,而不必在Django Admin外部创建自定义网页。但是,您必须在Django Admin体系结构内工作。

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

答案 2 :(得分:-1)

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

我认为这段代码将为您服务

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