2012-02-27 87 views
2

嗨我想禁用编辑(在Django的管理员)一些模型实例根据模型状态。如果状态将大于1,编辑将被禁用。我知道如何禁用左侧的链接,但是如果我设置了正确的URL,它仍然可以编辑,所以这个解决方案是不受欢迎的。Django的管理员 - 禁用特定模型实例的“编辑”

我的模型:

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) 

回答

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]

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) 

这是做这件事最简单的方法。