Django admin - отключить «редактирование» для конкретного экземпляра модели - PullRequest
2 голосов
/ 27 февраля 2012

Привет! Я хотел бы отключить редактирование (в Django admin) для некоторых экземпляров модели в соответствии со статусом модели. Если статус будет больше 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 ]

8 голосов
/ 28 февраля 2012
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)

См. [1]

0 голосов
/ 25 ноября 2016

Самый простой способ сделать это:

1) Добавить шаблон в папку шаблонов с именем ticket_change_form.html

2) Теперь добавьте следующую строку кода в шаблон.file

{% 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)

Это самый простой способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...