如何从Django的TabularInline管理视图中省略对象名称?

时间:2011-02-23 02:55:58

标签: django django-admin

我正在使用Django的TabularInline管理员视图来编辑与主要主题对象相关的类别对象,如下所示:

enter image description here

有没有办法显示对象的呈现名称(本例中的“常见问题”,“媒体处理和边距”等),没有创建自定义管理模板?换句话说,我只是想显示一个干净的输入字段网格。

我在这个片段中找到了相关的渲染代码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?

6 个答案:

答案 0 :(得分:56)

@ 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)

答案 1 :(得分:4)

我认为我想编辑你的模板将是最简单的。

我尝试迭代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(),这打破了其他事情。

我可以share some code任何人都不应该真正看到但是有效并让我笑得开心吗?我欠你一个payne。希望我今晚能入睡。

答案 2 :(得分:2)

您可以使用css隐藏段落

答案 3 :(得分:2)

我采取了略微不同的方法。这有点hackish。这将使用空字符串替换“原始”字符串,因此仍然会渲染class = original的td,在编辑框上方留下间隙。

我更喜欢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)

答案 4 :(得分:0)

如果有人想要隐藏StackedInline上的标题,我使用Rick´s approach但是添加了这个css:

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

答案 5 :(得分:0)

最简单的方法是在模板文件中添加一个css,Rick van der Zwet的答案是最好的