2013-06-05 58 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