在django管理员中,我有一个带内联的模型。我希望能够仅为内联显示“添加新”行,而不显示属于内联的表中任何预先存在的原始数据。这可能吗?我已经尝试了max_num和extra的每个组合,它总是显示现有的表数据。
由于
答案 0 :(得分:2)
我认为InlineAdmin
中的简单开关无法做到这一点
子类。但我可以想到一个小的“黑客”,它实现了同样的目标:
使用template
上的InlineAdmin
属性指定自定义模板
渲染你的内联。现在复制您要使用的原始模板
您的自定义模板(例如复制
django/contrib/admin/templates/admin/edit_inline/tabular.html
)。看着那(这
来源并找到{% for inline_admin_form in
inline_admin_formset %}
行并插入{% if not inline_admin_form.original %}
在它之后。在结束{% endif %}
之前插入{% endfor %}
标签
这种方法实际上只是隐藏了内联的输出。所以它仍然可能
通过将原始POST数据传递到页面来修改它们,例如使用curl
(但“攻击者”[读取:管理员用户;-)]必须知道django及其如何
在formsets中生成字段名。
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>
答案 1 :(得分:1)
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)