Django admin - 禁用特定模型实例的“编辑”

时间:2012-02-27 18:39:53

标签: django

您好我想根据模型状态禁用某些模型实例的编辑(在Django管理员中)。如果状态大于1,则将禁用编辑。我知道如何在左侧禁用该链接,但如果我设置了正确的URL,它仍然可以编辑,因此不欢迎此解决方案。

我的模特:

STATUS_CHOICES = (
                (1, _(u'p')),
                (2, _(u'w')),
                (3, _(u'l')),
                (4, _(u'p')),
)  

class Ticket(models.Model):
   author = models.ForeignKey(User, editable=False)
   status = models.PositiveIntegerField(_('status'), choices=STATUS_CHOICES, default=1, editable=False)

2 个答案:

答案 0 :(得分:8)

class MyModelAdmin(admin.ModelAdmin):
    ...
    def has_change_permission(self, request, obj=None):
        if obj is not None and obj.status > 1:
            return False
        return super(MyModelAdmin, self).has_change_permission(request, obj=obj)

See [1]

答案 1 :(得分:0)

执行此操作的最简单方法如下。

1)在名为ticket_change_form.html

的模板文件夹中添加模板

2)现在在模板文件中添加以下代码行

{% extends 'admin/change_form.html' %}
{% load admin_modify %}
{% block submit_buttons_bottom %}{% if not read_only %}{% submit_row %}{% endif %}{% endblock %}

3)接下来将此代码添加到您的admin.py文件中

class TicketAdmin(admin.ModelAdmin):
    change_form_template = 'ticket_change_form.html'

    def get_form(self, request, obj=None, **kwargs):
        return TicketForm

    def change_view(self, request, object_id, form_url='', extra_context=None):
        ticket_object = #get your object here using object_id
        context = {}
        context.update(extra_context or {})
        if not ticket_object.status: 
            context.update({'read_only': True})
        return super(TicketAdmin, self).change_view(request, object_id, form_url=form_url,
                                                        extra_context=context)

这是最简单的方法。