【问题标题】:Is it possible to have an admin inline without original data being shown?是否可以在不显示原始数据的情况下内联管理员?
【发布时间】:2010-01-19 14:32:26
【问题描述】:

在 django 管理员中,我有一个内联模型。我希望能够只为内联显示“添加新”行,而不是在属于内联的表中显示任何预先存在的原始数据。这可能吗?我尝试了max_numextra 的所有组合,它总是显示现有的表数据。

谢谢

【问题讨论】:

    标签: python django


    【解决方案1】:

    我认为通过InlineAdmin 中的简单开关这是不可能的 子类。但我可以想到一个实现相同目的的小“黑客”:

    使用InlineAdmin 上的template 属性来指定自定义模板 呈现你的内联。现在将您要使用的原始模板复制到 您的自定义模板(例如复制 django/contrib/admin/templates/admin/edit_inline/tabular.html)。看着那(这 source 并找到带有{% for inline_admin_form in inline_admin_formset %} 的行并插入{% if not inline_admin_form.original %} 在它之后。还要在结束 {% endfor %} 之前插入 {% endif %} 标记。

    这个方法实际上只是隐藏了内联的输出。所以它仍然可能 通过将原始 POST 数据传递到页面来修改它们,例如使用 curl (但是“攻击者”[阅读:管理员用户 ;-)] 必须知道 django 以及它是如何使用的 生成表单集中的字段名)。

    tabular.html 现在可能看起来像这样:

    {% load i18n %}
    <div class="inline-group">
      <div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
    {{ inline_admin_formset.formset.management_form }}
    <fieldset class="module">
       <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
       {{ inline_admin_formset.formset.non_form_errors }}
       <table>
         <thead><tr>
         {% for field in inline_admin_formset.fields %}
           {% if not field.is_hidden %}
             <th {% if forloop.first %}colspan="2"{% endif %}>{{ field.label|capfirst }}</th>
            {% endif %}
         {% endfor %}
         {% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %}
         </tr></thead>
    
         <tbody>
         {% for inline_admin_form in inline_admin_formset %}
         {% if not inline_admin_form.original %}
            {% if inline_admin_form.form.non_field_errors %}
            <tr><td colspan="{{ inline_admin_form.field_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>
            {% endif %}
            <tr class="{% cycle row1,row2 %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}">
    
            <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 %}
              {% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
              {{ inline_admin_form.fk_field.field }}
              {% spaceless %}
              {% for fieldset in inline_admin_form %}
                {% for line in fieldset %}
                  {% for field in line %}
                    {% if field.is_hidden %} {{ field.field }} {% endif %}
                  {% endfor %}
                {% endfor %}
              {% endfor %}
              {% endspaceless %}
            </td>
    
            {% for fieldset in inline_admin_form %}
              {% for line in fieldset %}
                {% for field in line %}
                  <td class="{{ field.field.name }}">
                  {{ field.field.errors.as_ul }}
                  {{ field.field }}
                  </td>
                {% endfor %}
              {% endfor %}
            {% endfor %}
    
            {% if inline_admin_formset.formset.can_delete %}
              <td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
            {% endif %}
    
            </tr>
    
         {% endif %}
         {% endfor %}
         </tbody>
       </table>
    
    </fieldset>
      </div>
    
      {# <ul class="tools"> #}
      {#   <li><a class="add" href="">Add another {{ inline_admin_formset.opts.verbose_name|title }}</a></li> #}
      {# </ul> #}
    
    </div>
    

    【讨论】:

    • 我认为在 Python 代码中会有更简洁的方法来执行此操作,方法是创建一个从不显示现有数据的 BaseInlineFormset 子类并覆盖 admin.ModelInline 子类上的正确方法以使其使用您的 formset 类.
    • 是的,我同意。我没有考虑过。也许我对表单集的经验较少。子类方法当然更干净,而不是“hack”。
    【解决方案2】:
    from django.forms.models import inlineformset_factory
    

    然后

    class ModelNameInlineFormSet(BaseInlineFormSet):
        def __init__(self, **kwargs):
            super(ModelNameInlineFormSet, self).__init__(**kwargs)
            self.queryset = ModelName.objects.none()
    
    class ModelNameInline(admin.TabularInline):
        formset = inlineformset_factory(ParentModelName, ModelName, 
                                        formset=ModelNameInlineFormSet)
    

    【讨论】:

      猜你喜欢
      • 2015-07-22
      • 2015-11-12
      • 2015-08-01
      • 2021-10-14
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多