Проверка Django inlinemodeladmin - но с общим отношением - PullRequest
6 голосов
/ 20 августа 2010

Раньше у меня были такие модели:

class AssemblyAnnotation(models.Model):
    assembly = models.ForeignKey(Assembly)
    type = models.ForeignKey(AssemblyAnnotationType)
    ...
    def clean(self):
        from django.core.exceptions import ValidationError
        if not self.type.can_annotate_aliases and self.assembly.alias_of_id is not None:
            raise ValidationError('The selected annotation type cannot be applied to this assembly.')

В результате новая AssemblyAnnotation (прикрепленная через строку) могла иметь только подмножество значений для своего атрибута типа в зависимости от родительской сборки.

Это прекрасно сработало.

Теперь пришло время применить эти аннотации к другим объектам, которые немного отличаются:

class ObjectAnnotation(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    type = models.ForeignKey(AssemblyAnnotationType)
    ...
    def clean(self):
        from django.core.exceptions import ValidationError
        if self.content_type == ContentType.objects.get_for_model(Assembly):
            if not self.type.can_annotate_aliases and self.content_object.alias_of_id is not None:
                raise ValidationError('The selected annotation type cannot be applied to this assembly.')

Как видите, я хочуприменяются те же правила.Тем не менее, есть проблема.GenericInline, который я сейчас использую, не устанавливает self.content_type до запуска моего метода clean ().

Есть ли способ обойти это?Я делаю это неправильно?

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 22 мая 2012

Я использую то же, что и вы, и это работает, как предполагалось. Вот мой код:

В моделях:

class GroupFlagIntermediate(models.Model):
    group_flag = models.ForeignKey(GroupFlag, related_name='flag_set')
    content_type = models.ForeignKey(ContentType, verbose_name='Flag Type')
    flag_pk = models.CharField('Flag PK', max_length=100, blank=True, default='')
    flag = generic.GenericForeignKey('content_type', 'flag_pk')

    def clean(self):
        from django.core.exceptions import ValidationError
        if not self.is_valid_flag(self.content_type.model_class()):
            raise ValidationError('The selected flag is not a real Flag.')

А в Админке:

class GroupFlagIntermediateInline(admin.TabularInline):
    model = GroupFlagIntermediate

class GroupFlagAdmin(admin.ModelAdmin):
    list_display = ('name', ...)
    inlines = [GroupFlagIntermediateInline]

admin.site.register(GroupFlag, GroupFlagAdmin)

После некоторых тестов я обнаружил, что поля content_type и object_id (flag_pk в моем случае) установлены перед вызовом clean (), но GenericForeignKey (flag в моем случае) «т.

0 голосов
/ 24 декабря 2011

Разве правая сторона не вернет список в if self.content_type == ContentType.objects.get_for_model(Assembly):?

Я думаю, вам нужно будет сделать if self.content_type in ContentType.objects.get_for_model(Assembly):

...