我正在开发一个CMSy应用程序,我已经实现了一组模型,允许创建自定义模板实例,由多个字段组成并绑定到特定客户。最终目标是可以通过Admin界面定义一个或多个带有一组自定义字段的模板,并将其与客户相关联,这样客户就可以按照模板规定的格式创建内容对象。
我似乎已经把这个连接起来,以便我可以创建任意数量的Template对象,但我正在努力如何在这些模板中创建实例 - 实际内容对象。例如,我可以为客户“Acme”定义模板“基本页面”,其中包含“标题”和“正文”字段,但我还没有想出如何创建可填写这些字段的基本页面实例。
这是我的(有些省略的)模特......
class Customer(models.Model):
...
class Field(models.Model):
label = models.CharField(max_length=255)
component = models.ForeignKey(ContentType,
limit_choices_to={'id__in': component_choices}
)
fields = models.Manager()
class Template(models.Model):
label = models.CharField(max_length=255)
clients = models.ManyToManyField(Customer, blank=True)
fields = models.ManyToManyField(Field, blank=True)
class ContentObject(models.Model):
label = models.CharField(max_length=255)
template = models.ForeignKey(Template)
author = models.ForeignKey(User)
customer = models.ForeignKey(Customer)
mod_date = models.DateTimeField('Modified Date', editable=False)
def __unicode__(self):
return '%s (%s)' % (self.label, self.template)
def save(self):
self.mod_date = datetime.datetime.now()
super(ContentObject, self).save()
提前感谢任何建议!
答案 0 :(得分:1)
如果您想坚持使用此模型体系结构,则需要向ContentObject类添加另一个字段,该字段将用于存储实际内容。它可能是这样的:
ContentObject(models.Model):
...
fields_content = models.ManyToManyField(Field, through=FieldContent)
...
然后:
class FieldContent(models.Model):
field = ForeignKey(Field)
content_object = ForeignKey(ContentObject)
content = CharField
然后你应该确定,可能使用pre_save信号,对于给定的ContentObject实例,只有实例模板中的字段可以转到FieldContent表。
然后您可以通过以下方式创建实际内容:
FieldContent.objects.create(field=your_field, content_object=your_content_object, content=content_given_by_the_customer)
答案 1 :(得分:0)
它只会是:
my_customer.templates.add(my_template)
其中my_customer
和my_template
分别是Customer
和Template
的实例。
答案 2 :(得分:0)
很抱歉,如果我不清楚的话。问题是如何基于模板创建实例,而不是如何创建模板。
我的模板类用于定义给定模板包含的字段以及客户可以使用的字段。我的ContentObject类用于基于模板定义内容记录。
再次感谢!
答案 3 :(得分:0)
为了扩展pawartur的答案,有几种方法可以处理字段的多个(可能是复杂的)数据类型。你可以尝试的一种方法是使用模型继承,可能是这样的:
class FieldContent(models.Model):
field = models.ForeignKey(Field)
content_object = models.ForeignKeyKey(ContentObject)
def get_component(self):
"""Return the specific component instance for this field."""
return self.field.get_object_for_this_type(pk=self.pk)
然后从每个字段类型组件的基础模型继承,例如:
class SomeComponent(FieldContent):
# specific fields for the component here
然后您可以执行以下操作: somecontentobject.get(ID =无论).fieldcontent_set.get(无论).get_component()。specific_component_field
要创建新的字段实例,您可能需要向Field模型添加辅助方法,例如:
def create_content(self, content_object):
return self.component.get_class().objects.create(
content_object=content_object, field=self)
有一点需要注意的是,所有这些东西确实倾向于让你与框架作斗争,Django曾经为你做的一切事情(表格,管理员等)突然变成了一些工作来解决。可能值得研究一些现实生活项目如何处理它,Django-cms(django-cms.org)可能是一个良好的开端。
只是一个警告:我没有测试过这篇文章中的任何代码,因为我没有安装任何有用的计算机,但通常应该没问题。