【发布时间】:2010-01-19 14:32:26
【问题描述】:
在 django 管理员中,我有一个内联模型。我希望能够只为内联显示“添加新”行,而不是在属于内联的表中显示任何预先存在的原始数据。这可能吗?我尝试了max_num 和extra 的所有组合,它总是显示现有的表数据。
谢谢
【问题讨论】:
在 django 管理员中,我有一个内联模型。我希望能够只为内联显示“添加新”行,而不是在属于内联的表中显示任何预先存在的原始数据。这可能吗?我尝试了max_num 和extra 的所有组合,它总是显示现有的表数据。
谢谢
【问题讨论】:
我认为通过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>
【讨论】:
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)
【讨论】: