Как сделать поле не изменяемым на странице редактирования, но можно создать на странице добавления? - PullRequest
0 голосов
/ 10 февраля 2011

У меня есть сценарий, приведенный ниже:

В моем models.py

class Room(models.Model):
   pop = models.ForeignKey('Pop', verbose_name="POP",
                           help_text="Pop this room belongs to", null=True,
                           blank=True)
   .... other fields ....

 class Pop(models.Model):
    .... fields ....

В моем admin.py

class RoomAdmin(admin.ModelAdmin):
    search_fields = [..some fields...]
    list_diplay = (pop, ....)
    ..... other configuration .....

Поскольку у Room есть связь с внешним ключом с Pop, можно связать несколько комнат с одним Pop. Я должен реализовать что-то вроде этого.

  1. Когда пользователь нажимает ссылку «Добавить Pop» со страницы администратора django, ему должно быть разрешено связывать несколько объектов Room с объектом Pop. Но как только объекты Room были связаны с Pop, его нельзя ни редактировать, ни связать с другим Pop с экрана редактирования. Можно ли этого добиться?

У меня есть эти возможные решения, но я не знаю, как реализовать эти идеи в Django или жизнеспособны ли эти идеи:

  1. Магия CSS. Я могу связать идентификатор CSS с поп-полем, чтобы его можно было включить только для экранов редактирования. Я не уверен, как это реализовать

  2. Django's admin.py, если бы я мог исключить всплывающее поле из экрана редактирования, то оно могло бы работать.

  3. Измените шаблоны, чтобы они могли поддерживать не редактируемые поля.

1 Ответ

1 голос
/ 10 февраля 2011

Вариант 2 самый лучший.Вы можете переопределить метод get_form в своем классе RoomAdmin, чтобы исключить поле pop при наличии объекта для редактирования:

def get_form(self, request, obj=None, **kwargs):
    # if there's an object and it has been previously saved
    if obj is not None and obj.id is not None:
        # add 'pop' to the list of fields to exclude
        exclude = list(kwargs.get('exclude', []))
        exclude.append('pop')
        kwargs['exclude'] = exclude
    return super(RoomAdmin, self).get_form(request, obj, kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...