我正在尝试验证从GenericInlineModelAdmin表单保存的通用关系对象。
创建对象时object_id
和content_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_id
和self.content_type
设置为None
。如果正在编辑标签,则它们已正确设置。
我在django 1.4.x和1.5.x上都试过这个。
答案 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