7

管理モデルで継承は可能ですか?

たとえば、次のことを考慮してください。

ファイル :models.py

class AbstractModel ( models.Model ):
    # Meta Information common to all classes
    author = models.ForeignKey(auth.models.User , null = False ,related_name="%(class)s_related_author" ) # The user who created 
    editor = models.ForeignKey(auth.models.User , null = True,related_name="%(class)s_related_editor" ) # The user who last edited                   
    created_at = models.DateTimeField(auto_now_add  = True) # Create Time
    edited_at = models.DateTimeField(auto_now = True) # Modify Time

    class Meta:
                abstract = True


class Topic( AbstractModel ):
    name = models.CharField(max_length = NameMaxLength , unique = True)
    version_number = models.IntegerField(default = 0)
    update_frequency = models.IntegerField()

同様の継承は、で使用されたときに正しい結果を生成しないようですModelAdmin

ファイル :admin.py

class Abstract_Admin_Model( admin.ModelAdmin ):
        fields =  ('author' , 'editor' , 'created_at' , 'edited_at')
        readonly_fields = ('author' , 'editor' , 'created_at' , 'edited_at')

        def save_model(self, request, obj, form, change):
                if not change :
                        obj.author = request.user
                else : 
                        obj.editor = request.user
                obj.save()

class Admin_Topic( Abstract_Admin_Model ):
     fields += ('name' , 'version_number' , 'update_frequency')


admin.site.register( Topic , Admin_Topic )

編集

私は提案に基づいて上記のモデルを変更しました、

admin.pyそのような場合、エラーは発生せず、モデルが管理者に表示されます。

class AbstractAdminModel(  admin.ModelAdmin  ):
        pass#fields = ['author' , 'editor' , 'created_at' , 'edited_at']


class Admin_Topic( AbstractAdminModel ):
    pass

admin.site.register( Topic , Admin_Topic )

しかし、私がそのようにそれを変更する場合

class AbstractAdminModel(  admin.ModelAdmin  ):
    fields = ['author' , 'editor' , 'created_at' , 'edited_at']


class Admin_Topic( AbstractAdminModel ):
    pass

admin.site.register( Topic , Admin_Topic )

次のエラーが発生します:

エラー

これがスタックトレースリンクです

問題: モデルが管理ページに表示されない

追加情報:

django1.2.5とpinax0.7.2、Ubuntu 11.04、python2.7.1+を使用

4

6 に答える 6

8

答えが遅いかもしれませんが、私と同じように、他の人も同様の問題を抱えている可能性があると思います。

これが私の解決策です-それが適切かどうかはわかりませんが、それは私にとってはうまくいき、上から他の人は同じことをすることができます(私と同じように、マルチテーブル継承(非抽象モデル)が必要だと仮定します)

class SiteEntityAdmin(admin.ModelAdmin):
    fieldsets = [
            (None, {'fields': ['name']}),
    ]


class PhotoAdmin(SiteEntityAdmin):
    fieldsets = [
             ('Photo details', {'fields': ['photo_url', 'description']}),
    ]
    fieldsets.insert(0, SiteEntityAdmin.fieldsets[0])
于 2011-11-19T21:11:58.930 に答える
4

はい、可能です。あなたがしたエラーは次のように置くことだと思います:

class Meta:
    abstract = True

あなたのAbstract_Admin_Modelクラスで。Metaクラスなしで試してください。

于 2011-09-11T03:33:03.277 に答える
1

問題はここにあります:

class Admin_Topic( admin.ModelAdmin ):

この行は継承を制御するため、次のようにする必要があります。

class Admin_Topic( Abstract_Admin_Model ):

また、注目に値すること: Django の慣習により適合させるよりTopicAdminも、使用したい場合があります。Admin_Topic

于 2011-09-11T03:38:57.093 に答える
0

変更した admin.py の継承が機能します。問題は、フィールド 'created_at' を管理者 (Admin_RSSFeed) に追加していることですが、モデルには存在しません (おそらく RSSFeed という名前ですか?)。(少なくとも、エラー スクリーンショットが伝えようとしているのはそれです。)

于 2014-04-07T04:48:53.963 に答える
0

変更してみてください:

    class Meta:
        abstract = True

    class Meta:
        model = Topic
        abstract = True
于 2011-09-11T04:10:07.317 に答える