首页 > 解决方案 > 如何自定义平面页面以与 django-oscar get_model 一起使用

问题描述

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

我正在寻找一种最少侵入性的方式来自定义 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

标签: djangodjango-oscardjango-flatpages

解决方案


在尝试了不同的方法之后,这是我的解决方案:从自定义页面模型创建 OneToOne-Relationship 到 FlatPage 以及从 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中找到此实现的源代码。

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


推荐阅读