向 Django FlatPage 代理模型添加字段

Add a field to a Django FlatPage proxy model

提问人:HBMCS 提问时间:6/14/2021 最后编辑:HBMCS 更新时间:6/15/2021 访问量:951

问:

这是我 models.py:

from django.contrib.flatpages.models import FlatPage

class FlatPageManager(models.Manager):
    def search(self, query=None):
        qs = self.get_queryset()
        if query is not None:
            or_lookup = (Q(title__icontains=query) |
                         Q(content__icontains=query)
                        )
            qs = qs.filter(or_lookup).distinct()
        return qs

class MyFlatPage(FlatPage):
    class Meta:
        proxy = True

    published = models.DateTimeField() # <- this is the field I want to add
    objects = FlatPageManager()

当我这样做时,我收到此错误:makemigrations

./manage.py makemigrations
SystemCheckError: System check identified some issues:

ERRORS:
?: (models.E017) Proxy model 'MyFlatPage' contains model fields.

我做错了什么?我想做的就是添加一个字段,以便我只能在将来的某个日期显示帖子。published

编辑

我现在了解到,根据定义,代理模型不接受新字段。那么,我的下一个问题是:如何将我现有的代理模型“转换”为其他东西(当然,我不会丢失我现有的数据),以便我可以有一个额外的字段?published

python django django-flatpages

评论


答:

1赞 Klim Bim 6/14/2021 #1

如果设置,则可以调整/增强 Python 级别的行为。您无法向代理模型添加其他字段。但是,您可以像设置函数或方法一样设置自定义对象管理器。proxy=True

医生

看一看模型继承 #3

您可以将默认行为添加到published

class FlatPage(models.Model):
   published = models.DateTimeField(auto_now_add=True)
   ...

第一次更新

如果您使用新字段扩展数据,则不会丢失数据。如果您想在通话前保存您的数据FlatPagepython manage.py dumpdata > db.json

第二次更新

models.py

from django.contrib.flatpages.models import FlatPage
from django.db import models

class MyCustomFlatePage(FlatPage):
   published = models.DateTimeField(auto_now_add=True)

forms.py

from django.contrib.flatpages.forms import FlatpageForm

class MyFlatPageForm(FlatpageForm):
    class Meta:
        model = MyFlatPage
        fields = '__all__'

admin.py

class MyFlatPageAdmin(FlatPageAdmin):
    form = MyFlatPageForm
    fieldsets = (
        (None, {'fields': ('url', 'title', 'content', 'published', 'sites')}),
        (_('Advanced options'), {
            'classes': ('collapse',),
            'fields': (
                'enable_comments',
                'registration_required',
                'template_name',
            ),
        }),
    )
admin.site.unregister(FlatPage)
admin.site.register(MyFlatPage, MyFlatPageAdmin)

评论

0赞 HBMCS 6/14/2021
谢谢。那么,在这种情况下,它将成为“多表继承”,对吗?
0赞 HBMCS 6/14/2021
另外,你是说我应该完全删除“Meta 代理”,而是用来扩展 FlatPage?它不是“我的”FlatPage 模型。它是 FlatPages 应用程序 (docs.djangoproject.com/en/3.2/ref/contrib/flatpages) 的一部分。class MyFlatPage(FlatPage):
0赞 HBMCS 6/15/2021
PS:即使用它扩展模型也不起作用。当我在管理后端加载自定义表单时,我收到“已发布的不是有效字段”错误。class MyFlatPage(FlatPage):...
1赞 Klim Bim 6/15/2021
@HBMCS 哪个部分在管理面板上显示您的模型?您的自定义模型不会位于 -section 下。您应该在自己的应用程序中找到它。我更新了我的答案。我的测试使用自定义平整页模型FLAT PAGES
0赞 HBMCS 6/23/2021
附带说明:将字段设置为只读,因此我要么需要添加到类中,要么在模型的字段定义中设置。auto_now_add=Truereadonly_fields = ('published,)MyFlatPageAdminnull=True, blank=True