如何自定义用于 django-oscar get_model的简单页面

How to customize flatpages to use with django-oscar get_model

提问人:Frank 提问时间:6/9/2021 更新时间:11/18/2021 访问量:227

问:

不幸的是,经过无数次尝试,我没有找到任何有希望的解决方案。

我正在寻找侵入性最小的方法来自定义 django-oscar 的“dashboard.pages”应用程序使用的平面页面。打破 django 应用程序的迁移历史记录并手动管理它们是可以的。

是否可以使用 oscar 的 get_model 加载器来解决它以及如何解决?(我不需要完整的解决方案,感谢每一个提示)


附加信息:

我的目的是创建一个 FlatPageCategory 模型

from oscar.core.utils import slugify

class FlatPageCategory(models.Model):
    name = models.CharField(max_length=255, db_index=True)
    url = models.SlugField()

并向 FlatPage 模型添加一些字段

from django.contrib.flatpages.models import FlatPage

class FlatPage(FlatPage):
    display_order = models.SmallIntegerField(
        default=0,
    )
    category = models.ForeignKey(
        'FlatPageCategory',
        on_delete=models.SET_NULL,
        blank=True, null=True,
    )
    attachments = models.ManyToManyField(
        File,
    )

    def get_absolute_url(self):
        """ Prepend category url if category exists. """
        url = super().get_absolute_url()
        if self.category:
            return f'{self.category.url}/{url}'
        return url
django django-flatpages

评论

0赞 daigorocub 11/16/2021
似乎不是这样。在 dashboard.pages.views 中,它们会这样做。一个可能可行的想法是克隆/分叉到一个新应用程序,也称其为“平板页面”,并在INSTALLED_APPS中替换。但是,即使这可行,您也有诸如在 oscar 仪表板页面应用程序内的“创建/更新”表单中使用的字段之类的东西。FlatPage = get_model('flatpages', 'FlatPage')django.contrib.flatpagesdjango.contrib.flatpages

答:

0赞 Frank 11/18/2021 #1

在尝试了不同的方法后,这是我的解决方案: 创建从自定义页面模型到 FlatPage 的 OneToOne-Relationship,以及从 Attachment 到 FlatPage 的 ForeignKey。

class Attachment(models.Model):
    flatpage = models.ForeignKey(
        FlatPage,
        related_name='attachments',
        on_delete=models.CASCADE,
    )
    title = models.CharField(
        max_length=250,
    )
    file = models.FileField(
        _('File'),
        upload_to='page_attachments/'
    )


class Page(models.Model):
    """ This is passed to the template context to build menu and urls """
    flatpage = models.OneToOneField(
        FlatPage,
        related_name='page',
        on_delete=models.CASCADE,
    )
    category = models.PositiveSmallIntegerField(
        _('Category'),
        choices=Category.choices,
        default=Category.UNDEFINED,
    )
    priority = models.SmallIntegerField(
        _('Priority'),
        default=0,
    )

您可以在 GitHub-Project 中找到此实现的源代码。

这并不是我想要并在问题中提出的解决方案,因此我认为这个问题应该保持开放。