我有以下四个班级:
class Subject(Sortable):
name = models.CharField(max_length=100)
hebrew_name = models.CharField(max_length=100)
color = models.CharField(max_length=6)
class Category(Sortable):
name = models.CharField(max_length=100)
hebrew_name = models.CharField(max_length=100)
Subject = SortableForeignKey(Subject)
class Subcategory(Sortable):
name = models.CharField(max_length=100)
hebrew_name = models.CharField(max_length=100)
Category = SortableForeignKey(Category)
class Summary(models.Model):
title = models.CharField(max_length=128)
subject = models.ForeignKey(Subject)
category = models.ForeignKey(Category)
subcategory = models.ForeignKey(Subcategory)
content = RichTextField(null=True, blank=True)
基本上,主题包含类别,类别包含子类别,每个摘要与每个类别相关联。
目前,摘要类中字段之间的关系与主题类别和子类别之间的关系无关。
我想要的基本上是能够创建一个必须首先选择一个主题的表单(例如从下拉列表中),然后才能选择一个类别相同的下一个下拉列表,从该主题中的类别填充然后应该与子类别一起发生..
我希望这可以在可能的最高级别强制执行,如果我可以在理想的数据库级别进行此操作。
显然,如果摘要是在主题文献之下,它不能成为类别的一部分"民族主义的兴起"例如,这是一个历史类别。
答案 0 :(得分:1)
我认为你不应该在数据库级别这样做。您的模型之间的关系很好,但数据库并不关心什么是"文献"类别是什么。该体系结构强制实施数据体系结构的完整性,即子类别只有一个类别。然后,由您来强制执行内容的完整性。
因此,对于您的具体问题,我认为您最好选择通过Ajax处理表单。您可以使用所需的字段设置表单,并通过Ajax填充这些字段,从上面的字段中选择回调。
当用户验证表单时,您可以执行自定义验证(在表单的clean方法中),测试数据的完整性并在需要时引发自定义错误。
让我们知道您是否需要使用表单+视图+ js部分进行更详细的回答。