2

我正在尝试验证从 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 上都试过这个。

4

1 回答 1

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
于 2014-05-07T11:32:51.323 回答