Администратор Django: Как сохранить только встроенную модель, а не родительскую - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть следующие упрощенные настройки:

  • Модель, основанная на устаревших данных, которые нельзя изменить.Поэтому я поднимаю ValidationError, чтобы пользователь знал, что не было никаких изменений.Поля формы доступны только для чтения, и я мог бы использовать простой «проход», но я предпочел бы получить сообщение о том, что save () не выполняет того, для чего он предназначен, вместо того, чтобы просто ничего не делать.
  • Теперь яЯ расширяю устаревшие данные с помощью второй модели, которая должна быть редактируемой.Он включен в устаревшую модель ModelAdmin как встроенный.Я мог бы включить сам CommentModel в качестве ModelAdmin, но поскольку LegacyModel наследует множество функциональных возможностей от родительских классов, это становится сложным и необременительным.

Мне нужно выполнить операцию «сохранить»только на inline-модели.Я думал, так как все поля только для чтения, он должен работать нормально.Может ли кто-нибудь дать мне подсказку сделать это чисто?

class Legacy(models.Model):

    legacyData = models.TextField()

    def clean(self):
        raise ValidationError("%s model is readonly." % self._meta.verbose_name.capitalize())

class Comment(models.Model):

    legacy = models.OneToOneField(Legacy)
    comment = models.TextField()


class LegacyAdmin(admin.ModelAdmin):

    def __init__(self, *args, **kwargs):
        self.readonly_fields = self.fields
        super(LegacyAdmin, self).__init__(*args, **kwargs)

    model = Legacy
    inlines = (CommentInline, )

Большое спасибо за ваше время!:)

1 Ответ

1 голос
/ 18 апреля 2011

Вместо того, чтобы вызывать исключение в clean (), вы можете переопределить прежнюю функцию save () и использовать http://docs.djangoproject.com/en/dev/ref/contrib/messages/, чтобы сообщить своему пользователю, что не произошло.

...