我今天也遇到了同样的问题,我想我找到了一种可以接受的方法来解决它。这是我所做的:
只有当特定字段具有特定值时,我才必须使内联可删除。具体来说,当我处理一般任务和分配时,只有未接受的任务必须是可删除的。在模型方面:
class Task(models.Model):
STATUS_CHOICES = (
('PND', 'Pending'),
('ACC', 'Accepted'),
)
status = models.CharField( ----> If this != 'PND', inline instance
max_length=3, should not be deletable
choices=STATUS_CHOICES,
default=STATUS_CHOICES[0][0])
由于我也不能在我的admin.TabularInline 类中使用has_delete_permission,因为它指的是整个字段集(即所有内联)而不是单行,所以我经历了模板覆盖的路径:
tabular.html:44-62(原始)
[...]
{% for fieldset in inline_admin_form %}
{% for line in fieldset %}
{% for field in line %}
{% if not field.field.is_hidden %}
<td{% if field.field.name %} class="field-{{ field.field.name }}"{% endif %}>
{% if field.is_readonly %}
<p>{{ field.contents }}</p>
{% else %}
{{ field.field.errors.as_ul }}
{{ field.field }}
{% endif %}
</td>
{% endif %}
{% 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 %}
[...]
tabular.html(覆盖)
[...]
{% for fieldset in inline_admin_form %}
{% for line in fieldset %}
{% for field in line %}
{% if not field.field.is_hidden %}
<td{% if field.field.name %} class="field-{{ field.field.name }}"{% endif %}>
{% if field.is_readonly %}
<p>{{ field.contents }}</p>
{% else %}
{% include "admin/includes/field.html" with is_tabular=True %}
{% endif %}
</td>
{% endif %}
{% endfor %}
{% endfor %}
<!-- Custom deletion logic, only available for non-accepted objects -->
{% for line in fieldset %}
{% for field in line %}
{% if field.field.name == "status" %}
{% if field.field.value == "PND" %}
<td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
{% else %}
<td class="delete"><input type="checkbox" disabled="disabled">
<img src="/static/admin/img/icon_alert.gif" data-toggle="tooltip" class="title-starter"
data-original-title="Can't remove accepted tasks" />
</td>
{% endif %}
{% endif %}
{% endfor %}
{% endfor %}
{% endfor %}
<!-- Classic deletion, removed
{% if inline_admin_formset.formset.can_delete %}
<td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
{% endif %}
-->
[...]
结果(非标准图形,我使用django-admin-bootstrap):
严格来说“优雅”,我必须通过两次行的字段才能使其工作,但我还没有找到更好的方法,比如直接读取该字段的值。我不能有像{{ line.fields.0.status }} 或{{ line.fields.status }} 这样的工作。如果有人能指出直接语法,我很乐意更新我的解决方案。
无论如何,既然它仍然有效,而且它并不是真的那么糟糕,我会接受这种方法,直到出现明显更好的结果。