【问题标题】:How to omit object name from Django's TabularInline admin view?如何从 Django 的 TabularInline 管理视图中省略对象名称?
【发布时间】:2011-07-02 11:22:27
【问题描述】:

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

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

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

【问题讨论】:

标签: django django-admin


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • padding-top 更改为 5px 以与没有 has_original 的行保持一致
      • 这在 Django 1.11 中运行良好,只需使用 10px 作为 padding-top。
      • 不幸的是,当 show_change_link 设置为 True 时,这将隐藏编辑按钮(链接在段落内并且文本没有自己的环绕元素...)
      【解决方案4】:

      我采取了稍微不同的方法。这有点骇人听闻。这会将“原始”字符串替换为空白字符串,因此 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)
      

      【讨论】:

      • 我喜欢这种方法,但它确实适用于我的 Django 2.1.7。
      • nice hack 在 Django 2.2.5 上工作必须为“TypeError: str 返回非字符串”错误添加一个“else”条件
      • 好的,在测试后它会导致继承问题我试过@Rick van 它在 django 2.2.5 上也可以正常工作
      【解决方案5】:

      你可以使用 css 隐藏段落

      【讨论】:

        【解决方案6】:

        我想我会说编辑您的模板将是最简单的。

        我尝试迭代 render_change_form 中的表单集,但不幸的是,主要问题是 InlineAdminForms 是在模板中迭代时动态构建的,因此您不能只设置 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 没有人应该真正看,但工作,让我笑起来?我欠你一分钱。希望今晚我可以入睡。

        【讨论】:

        • 谢谢!我怀疑编辑模板才是真正的答案。
        猜你喜欢
        • 1970-01-01
        • 2011-08-18
        • 2013-09-19
        • 2018-07-23
        • 2012-05-02
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多