2012-02-27 10 views
2

こんにちは私は、モデルステータスに応じていくつかのモデルインスタンスの編集を(Django管理者で)無効にしたいと思います。ステータスが1より大きい場合、編集は無効になります。私は左側のリンクを無効にする方法を知っていますが、正しいURLを設定してもまだ編集可能なのでこのソリューションは歓迎されません。Django admin - 特定のモデルインスタンスの "編集"を無効にする

マイモデル:

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)今すぐあなたadmin.pyファイルにこのコードを追加するには、テンプレートファイル

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

3)次のコードの次の行を追加します。

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) 

これはこれを行う最も簡単な方法です。

関連する問題