如何在Django中创建相关模型的实例

5 投票
4 回答
2934 浏览
提问于 2025-04-15 20:37

我正在开发一个内容管理系统(CMSy)应用程序,为此我实现了一套模型,允许创建自定义模板实例。这些模板由多个字段组成,并且与特定客户关联。最终目标是通过管理界面定义一个或多个带有自定义字段的模板,并将其与客户关联,这样客户就可以根据模板的要求创建内容对象。

我似乎已经成功地连接了这些内容,以便我可以创建任意数量的模板对象,但我在如何在这些模板中创建实例(也就是实际的内容对象)方面遇到了困难。例如,我可以为客户“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()

提前感谢任何建议!

4 个回答

0

抱歉,如果我之前没说清楚。问题在于如何根据一个模板来创建实例,而不是如何创建这些模板。

我的模板类是用来定义一个模板包含哪些字段,以及哪些客户可以使用这个模板。我的内容对象类是用来根据模板定义一个内容记录的。

再次感谢!

0

这段代码就是这样:

my_customer.templates.add(my_template)

其中 my_customermy_template 分别是 CustomerTemplate 的实例,也就是具体的对象。

可以查看 关于相关对象的文档 来了解更多信息。

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)

撰写回答