Как не указывать имя объекта в административном представлении Django TabularInline? - PullRequest
28 голосов
/ 23 февраля 2011

Я использую административное представление Django TabularInline для редактирования объектов категории, связанных с основным объектом темы, как показано здесь:

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 %}
   ...

Isесть короткий, умный способ опустить {{ inline_admin_form.original }} или вернуть Null?

Ответы [ 6 ]

56 голосов
/ 05 апреля 2011

@ 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)
4 голосов
/ 23 февраля 2011

Я подумал, что лучше всего отредактировать ваш шаблон.

Я пытался перебирать наборы форм в render_change_form, но, к сожалению, главная проблема в том, что InlineAdminForm sсоздается динамически после итерации в шаблоне, поэтому вы не можете просто установить 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 голосов
/ 28 марта 2013

Я выбрал немного другой подход.Это немного хакерски.Это заменяет «оригинальную» строку пустой строкой, поэтому значение 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)
2 голосов
/ 25 февраля 2011

Вы можете использовать css, чтобы скрыть абзац

0 голосов
/ 27 сентября 2018

Самый простой способ сделать это - добавить CSS в файл шаблона. Лучший ответ - Рик ван дер Цвет

0 голосов
/ 13 августа 2017

В случае, если кто-то хочет скрыть заголовок на StackedInline, я использовал подход Рика , но добавив этот css:

div.inline-related h3{
   visibility: hidden;
   height: 0;
}
...