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)
без эффекта (ни одна строка не показана вообще).
Ответы
Ответ 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)