2013-06-05 30 views
3

我想验证从GenericInlineModelAdmin窗体保存的通用关系对象。从GenericInlineModelAdmin的Django验证通用关系

创建对象时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上都试过这个。

回答

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