我正在使用此博客: 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."?
感谢您提供帮助以使该工作正常进行。
答案 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开发人员,您所引用的博客也会使您感到困惑。它的代码片段很小,因此您显然对丢失的代码位感到困惑。例如
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是一篇更好的博客文章,可能与您所做的事情有些相关。我建议您撤消所做的事情,然后重新开始。
答案 2 :(得分:-1)
admin.site.register()的第一个参数应为模型类
我认为这段代码将为您服务
@admin.register(yourmodelclass)
class yourmodelclassAdmin(ModelAdmin):
change_list_template = 'admin/test_attempt.html'