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_idで とself.content_typeが に設定されNoneます。タグが編集されている場合、それらは適切に設定されています。

django 1.4.x と 1.5.x の両方でこれを試しました。

4

1 に答える 1

0

これは Django の未解決のバグのようです (issue #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 に答える