Невозможно создать пользовательский URL-адрес шаблона администратора, получать ошибки шаблона и создавать пользовательские ошибки сайта администратора - PullRequest
3 голосов
/ 04 марта 2020

Я использую этот блог: https://medium.com/@adriennedomingus / добавление пользовательских просмотров или шаблонов к django -admin-740640cc6d42

Невозможно создать собственный шаблон посмотреть в Django Админ. Я получаю django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet

Если я закомментирую приложение в файле settings.py, я получаю ошибку admin.site.register(Template, TemplateAdmin) NameError: name 'Template' is not defined.

Если я импортирую шаблон из django .templates, то я get TypeError: 'type' object is not iterable

Невозможно сделать: 1) custom_admin_site.register & 2) models.Tample не найден. Говорит, что в моделях нет шаблона.

У меня есть это на 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',

Я прочитал это: как исправить django admin "У вас нет прав для просмотра или отредактируйте что-нибудь. "?

Любая помощь, чтобы получить эту работу приветствуется.

Ответы [ 3 ]

4 голосов
/ 29 апреля 2020

Я не уверен на 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

Это шаблон, который будет использоваться при нажатии для проверки или изменения (или добавления в этом отношении) конкретного экземпляра модели, которая у вас есть. Если у вас будет ссылка на ваш новый вид, вам нужно будет изменить этот шаблон и добавить ссылку на любой URL, который вы определите в # 3. Кстати, если все, что вы хотите сделать, это настроить это представление, вы можете игнорировать все остальное, все, что вам нужно сделать, это добавить то, что вам нужно, к этому шаблону.

# 2

Вы должны понять, почему мы должны использовать get_urls. Обычно, чтобы вернуть конкретное представление, вы устанавливаете в urls.py что-то, что будет указывать на конкретное представление, которое у вас есть (обычно определяется где-то вроде views.py). Однако мы хотим добавить представление admin, и все URL, начинающиеся с admin/..., рассматриваются внутри приложения администратора. Чтобы обойти это, django предоставляет нам метод get_urls в ModelAdmin, поэтому мы можем добавить дополнительные представления.

# 3

self.admin_view() просто добавляет некоторые дополнительные логи c об авторизации, чтобы нам не пришлось об этом беспокоиться. Обратите внимание, что в строке выше нам нужно добавить только конечную часть 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/ Они дают объяснение, как делать все, что вам нужно.

2 голосов
/ 01 мая 2020

Блог, на который вы ссылаетесь, может сбить с толку даже опытного разработчика Django. У него очень маленькие фрагменты кода, так что вы, очевидно, совершенно не понимаете пропущенные фрагменты кода. Например,

  1. Эта добавленная вами строка неверна: from django.templates import Template # THIS IS WRONG!

Template вот класс 'model', созданный автором блога (он также не хорошее название для модели - это слишком обобщенно c). Так что в основном у вас будет что-то вроде этого в вашем models.py:

from django.db import models

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

Тогда в вашем админе вы можете сделать from .models import Template.

Раздел о CustomAdminSite в посте блога не важен для создания пользовательского шаблона и просто смущает вас.

В любом случае вы должны перечислите приложения под INSTALLED_APPS в settings.py. Вы не можете удалить их оттуда.

Вы также путаете номенклатуру: шаблоны и (Django) приложения - это совершенно разные понятия. Идея шаблонов и представлений одинакова, независимо от того, настраиваете ли вы Django Admin или пользовательские веб-страницы. Django Администратор - это просто пользовательский вспомогательный сайт, предоставляемый Django. Вы определенно можете настроить Django Admin, и вам не нужно создавать собственные веб-страницы, внешние по отношению к Django Admin. Однако вам придется работать в архитектуре Django Admin.

Здесь гораздо лучший пост в блоге, который может быть несколько связан с тем, что вы ' делаешь Я бы посоветовал вам отменить то, что вы сделали, и начать заново sh.

0 голосов
/ 29 апреля 2020

первый аргумент admin.site.register () должен быть классом модели

Я думаю, этот код будет работать для вас

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