Django从GenericInlineModelAdmin验证通用关系

时间:2013-06-05 15:55:02

标签: django django-models django-forms django-admin

我正在尝试验证从GenericInlineModelAdmin表单保存的通用关系对象。

创建对象时object_idcontent_type设置为None,我无法访问它的相关对象,但是当对象更新时,它们已正确设置。

以下是示例代码:

models.py

class Article(models.Model):
    title = models.CharField(max_length=32)
    body = models.TextField()

class TaggedItem(models.Model):
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

    def clean(self, exclude=None):
        pass

admin.py

class InlineTags(generic.GenericTabularInline):
    model = TaggedItem

class ArticleAdmin(admin.ModelAdmin):
    inlines = [InlineTags]

admin.site.register(Article, ArticleAdmin)

如果您添加标记,则TaggedItem.clean()方法self.object_idself.content_type设置为None。如果正在编辑标签,则它们已正确设置。

我在django 1.4.x和1.5.x上都试过这个。

1 个答案:

答案 0 :(得分:0)

这似乎是Django中未解决的错误(问题#19255)。

我还没有对它进行测试,但由于您要在管理员中保存标记,因此您可以通过添加自定义ModelForm来解决此问题:

class InlineTagsForm(forms.ModelForm):
    def clean(self):
        """ Validate object_id & content_type fields """
        assert self.cleaned_data.get('object_id')
        assert self.cleaned_data.get('content_type')
        return self.cleaned_data


class InlineTags(generic.GenericTabularInline):
    model = TaggedItem
    form = InlineTagsForm