Подтвердить что ты не робот

Django admin различные строки для изменения и добавления вида

Мне нужны отдельные виды для добавления и изменения страницы. В добавленной странице я хотел бы исключить некоторые поля из встроенного набора форм. Я подготовил два класса TabularInline, один из которых содержит свойство "exclude". Я попытался использовать их следующим образом:

class BoxAdmin(admin.ModelAdmin):
    def change_view(self, request, obj_id):
        self.inlines=[ItemChangeInline,]
        return super(BoxAdmin, self).change_view(self.request, obj_id)
    def add_view(self, request):
        self.inlines=[ItemAddInline,]
        return super(BoxAdmin, self).add_view(self, request)

без эффекта (ни одна строка не показана вообще).

4b9b3361

Ответ 1

Он работает с Django 1.5+ и кажется прекрасным и элегантным:

// admin.py
class BoxAdmin(ModelAdmin):

    inlines = ()

    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.inlines = (ItemChangeInline, )
        return super(BoxAdmin, self).change_view(request, object_id)

    def add_view(self, request, form_url='', extra_context=None):
        self.inlines = (ItemAddInline, )
        return super(BoxAdmin, self).add_view(request)

надеюсь, что это может быть полезно для всех

Ответ 2

Вот код, который, кажется, работает:

class BoxAdmin(admin.ModelAdmin):
   def change_view(self, request, obj_id):
        self.inlines=[ItemChangeInline,]
        for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)
        return super(BoxAdmin, self).change_view(request, obj_id)
    def add_view(self, request):
        self.inlines=[ItemAddInline,]
        for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)
        return super(BoxAdmin, self).add_view(request)

Однако это выглядит неэлегантно, вызывая эту часть:

            for inline_class in self.inlines:
            inline_instance = inline_class(self.model, self.admin_site)
            self.inline_instances.append(inline_instance)

- это копия-вставка из метода init admin.ModelAdmin(поэтому он запускается дважды).

Ответ 3

Почему в add_view у вас есть .add_view(self, request), а в режиме просмотра у вас есть .change_view(self.request, ..)? Я считаю, что вам не нужно быть в add_view, поскольку вы используете супер.

Ответ 4

У меня была ситуация, когда мне нужно было показать Inline на основе сайта администратора, на котором вы были для данной истории.

Расширяя ответ на alekwisnia, я смог получить динамические строки, работающие для Django 1.3, используя следующий код:

В бликах /admin.py

class HighlightInline(generic.GenericTabularInline):
    model = Highlight
    extra = 1
    max_num = 4
    fields = ('order', 'highlight')
    template = 'admin/highlights/inline.html'

class HighlightAdmin(admin.ModelAdmin):
    def regulate_highlight_inlines(self):
        highlights_enabled = Setting.objects.get_or_default('highlights_enabled', default='')
        highlight_inline_instance = HighlightInline(self.model, self.admin_site)
        highlight_found = any(isinstance(x, HighlightInline) for x in self.inline_instances)
        if highlights_enabled.strip().lower() == 'true':
            if not highlight_found:
                self.inline_instances.insert(0, highlight_inline_instance)
        else:
            if highlight_found:
                self.inline_instances.pop(0)
        print self.inline_instances

    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.regulate_highlight_inlines()
        return super(HighlightAdmin, self).change_view(request, object_id)

    def add_view(self, request, form_url='', extra_context=None):
        self.regulate_highlight_inlines()   
        return super(HighlightAdmin, self).add_view(request, form_url, extra_context)

В рассказе /admin.py

class StoryAdmin(HighlightAdmin):

Следует отметить, что я не просто манипулирую встроенными классами (HighlightInline), а скорее меняю встроенные экземпляры (HighlightInline (self.model, self.admin_site)). Это связано с тем, что django уже построил список встроенных экземпляров на основе списка встроенных классов во время начальной конструкции класса admin.

Ответ 5

Другое решение для Django 1.3

class BoxAdmin(admin.ModelAdmin):

    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.inline_instances = [ItemChangeInline(self.model, self.admin_site)]
        return super(BoxAdmin, self).change_view(request, object_id, extra_context)

    def add_view(self, request, form_url='', extra_context=None):
        self.inline_instances = [ItemAddInline(self.model, self.admin_site)]
        return super(BoxAdmin, self).add_view(request, form_url, extra_context)