提问人:Frank 提问时间:6/9/2021 更新时间:11/18/2021 访问量:227
如何自定义用于 django-oscar get_model的简单页面
How to customize flatpages to use with 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
答:
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 中找到此实现的源代码。
这并不是我想要并在问题中提出的解决方案,因此我认为这个问题应该保持开放。
评论
FlatPage = get_model('flatpages', 'FlatPage')
django.contrib.flatpages
django.contrib.flatpages