2016-02-23 2 views
1

Я использую Django 1.9.Django Admin - отключить обновление для полей FK

У меня есть несколько моделей:

class MyOtherModel: 
    my_other_prop = models.IntergerField() 

class MyModel: 
    some_prop = models.IntegerField() 
    my_other_model = models.ForeignKey(MyOtherModel) 

И моя модель админ:

class MyModelAdmin(ModelAdmin): 
    model = MyModel 
    fields = ['some_prop', 'my_other_model'] 

Теперь это по умолчанию даст мне возможность установить my_other_model, создавать my_other_model и обновлять my_other_model на форме , Я хочу отключить редактирование (обновление) my_other_model. Я все еще хочу иметь возможность установить его и все еще хочу иметь возможность создать его с MyModelAdmin. Поскольку MyOtherModel не отображается через админ в любом другом месте, идея состоит в том, что с точки зрения админ-секции модель неизменна.

Я вырыл вокруг документов Django и немного искал Google, но не нашел способ выполнить это. Я не хочу, чтобы поле было только для чтения, потому что я хочу иметь возможность создавать их. Я не думаю, что хочу переопределить get_readonly_fields(), чтобы вернуть false, если объект существует в этом случае, потому что я все равно хочу, чтобы иметь возможность изменять, какой MyOtherModelMyModel имеет .. просто не отредактировал MyOtherModel сам.

Может ли кто-нибудь указать мне правильное направление здесь? Должен ли я использовать другой подход? Любой совет будет оценен, спасибо много!

ответ

0

Если я правильно понял ваш вопрос, будет ли это работать?

Disable link to edit object in django's admin (display list only)?

+0

Пол, спасибо за ответ. Нет, это не будет работать так, как это делается для полей в ссылках при просмотре списка. Я пытаюсь сделать это, находясь в режиме редактирования/создания. – TheMethod

+0

Если вы посмотрите на строки 160 и переопределение полей формы в коде администратора, разрешения могут работать. или просто переопределить поле потенциально: https://github.com/django/django/blob/917cc288a38f3c114a5440f0749b7e5e1086eb36/django/contrib/admin/options.py – Paul

0

Вы можете переопределить метод get_form() в классе администратора использовать другую форму в редактировании & создавать страницы:

class ReadOnlyPkForm(ModelForm): 
    class Meta: 
     model = MyModel 
     exclude = ('myothermodel',) 



class MyModelAdmin(ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     if obj: # Object intstance, so we're in edit page 
      # Override form, to use custom form 
      kwargs['form'] = ReadOnlyPkForm 
     return super(MyModelAdmin, self).get_form(request, obj, **kwargs) 

Предыдущий фрагмент кода будет использовать форму пользовательских ReadOnlyPkForm - - который исключает поле - при попытке редактировать экземпляр. Стандартная форма (т. Е. Все поля модели) без исключения будет использоваться при попытке создать новый экземпляр. Вы могли бы дополнительно настроить ReadOnlyPkForm на init, если бы вы хотели, чтобы поле отображалось как только для чтения (я просто использовал exclude, чтобы упростить выборку).

В классах с админами также есть методы change_view() и add_view(), которые вы также можете использовать для переопределения форм на страницах редактирования/создания, но, по моему опыту, они предназначены для более сложных модификаций (например, шаблона underyling), не говоря уже об этих двух методах может иметь странное поведение из-за проблем с кешированием.

Смежные вопросы