我有两个型号分类和产品。
示例:
models.py
class Product:
categories = models.ManyToManyField(Category)
name = models.CharField(max_length=255)
class Category:
categories = models.ForeignKey(self)
name = models.CharField(max_length=255)
作为表单我使用ModelForm:
class ProductForm(ModelForm):
class Meta:
model = Product
fields = ['categories', 'name', 'short_description', 'description']
widgets = {
'categories': MyWidget,
}
我想要实现的目标:
我想在产品表单创建上实现条件选择(窄选项):
用户选择1级类别(A1,C1)。如果父母有子女,则会出现一个带有子女的新选择框(2级A2)
我认为的选项:
实用,让我说我有7个选择框,每个框的值都是:
答案 0 :(得分:2)
Django允许您将ForeignKey
或ManyToManyField
中引用的模型定义为'<app_name>.<model_name>'
字符串,而不必导入模型并直接分配它。这解决了很多问题,特别是循环导入。
假设您的应用categories
包含Category
模型且products
包含Product
型号,则:
products/models.py
:
class Product:
categories = models.ManyToManyField(Category)
name = models.CharField(max_length=255)
categories/models.py
:
class Category:
categories = models.ManyToManyField(self)
name = models.CharField(max_length=255)
可以直接转换为您需要的内容:
products/models.py
:
class Product:
categories = models.ManyToManyField('categories.Category')
name = models.CharField(max_length=255)
categories/models.py
:
class Category:
categories = models.ManyToManyField('self')
name = models.CharField(max_length=255)
有了这个,您可以拥有任意数量的类别:
category_one = Category.create(name='Category one')
category_two = Category.create(name='Category two')
category_three = Category.create(name='Category three')
category_three.categories.add(category_one, category_two)
some_product = Product.create(name='Test Product')
some_product.categories.add(category_three)
同样重要的是要注意,对于任何Python类,self
不是类本身 - 它是实例。因此,您无法在实例方法之外引用它,因此可以很好地解释为什么here。 'self'
字符串在此处工作的唯一原因是因为Django将其转换为其所在的类categories.Category
- 所以将self
替换为{可能是个好主意{1}}要明确。