Как опустить имя объекта из Django TabularInline?
Я использую Django TabularInline
admin view для редактирования объектов категории, связанных с основным объектом темы, как показано ниже:
![enter image description here]()
Есть ли способ не отображать отображаемые имена объектов ( "Общие вопросы", "Обработка носителей и поля" и т.д. в этом примере), без создания настраиваемого шаблона администратора? Другими словами, я просто хочу показать чистую сетку полей ввода.
Я нашел соответствующий код рендеринга здесь, на этом фрагменте:
...
<td class="original">
{% if inline_admin_form.original or inline_admin_form.show_url %}<p>
{% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %}
{% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %}
</p>{% endif %}
...
Есть ли короткий, умный способ опустить {{ inline_admin_form.original }}
или вернуть его Null?
Ответы
Ответ 1
Мне показалось, что я перепутаю, что редактирование вашего шаблона будет самым простым.
Я попытался выполнить итерацию с помощью форм в render_change_form
, но, к сожалению, главная проблема заключается в том, что InlineAdminForm
динамически строятся на итерации в шаблоне, поэтому вы не можете просто установить inlineadminform.original = None
или изменить контекст.
Они даже не существуют, пока не назначена переменная в шаблоне.
# InlineAdminFormset
def __iter__(self):
for form, original in zip(self.formset.initial_forms, self.formset.get_queryset()):
yield InlineAdminForm(self.formset, form, self.fieldsets,
self.opts.prepopulated_fields, original, self.readonly_fields,
model_admin=self.model_admin)
и единственный доступный без крючка крючок, который у нас есть, переопределяет InlineAdminFormset.formset.get_queryset()
, что нарушает другие вещи.
Могу ли я поделиться каким-то кодом? Никто никогда не должен смотреть на меня, а работает и заставляет меня взмахиваться? Я должен тебе заплатить. Надеюсь, сегодня я могу заснуть.
Ответ 2
@sjaak-schilperoort Ницца! CSS действительно является "трюком" для использования. Пример класса Foo
, который имеет Bar
как встроенный.
static/css/hide_admin_original.css
:
td.original p {
visibility: hidden
}
.inline-group .tabular tr.has_original td {
padding-top: 5px;
}
admin.py
:
class FooAdmin(admin.ModelAdmin):
inlines = [ BarInline, ]
class Media:
css = { "all" : ("css/hide_admin_original.css",) }
admin.site.register(Foo, FooAdmin)
Ответ 3
Вы можете использовать css, чтобы скрыть абзац
Ответ 4
Я использовал несколько иной подход. Это немного хаки. Это заменяет "оригинальную" строку пустой строкой, поэтому td для class= original все равно получает визуализацию, оставляя пробел над полями редактирования.
Мне нравится решение CSS лучше (мне пришлось использовать "padding-top: 5px;", чтобы получить право на рендеринг).
models.py:
class Model(model.Model):
general_questions = models.TextField()
_hide = False
def __unicode__(self):
if _hide:
return ''
admin.py:
class ModelInline(admin.TabularInline):
model = Model
extra = 0
class ModelAdmin(admin.ModelAdmin):
inlines = [ModelInline, ]
def render_change_form(self, request, context, *args, **kwargs):
for formset in context['inline_admin_formsets']:
qs = formset.formset.queryset
for model_obj in qs:
model_obj._hide = True
return super(ModelAdmin, self).render_change_form(request, context, *args, **kwargs)
Ответ 5
Если кто-то хочет скрыть заголовок на StackedInline
, я использовал подход Рика, но добавив этот css:
div.inline-related h3{
visibility: hidden;
height: 0;
}