我有很多类别:
- 家园
- 土地
- 公寓
如果我想要每个类别的不同形式,如何设计模型(最佳)?每个类别都有不同的字段(有些重复)
模型.py
class model_abstract(models.Model):
//repeat fields here
class Meta:
abstract = True
class Home(model_abstract):
//fields here
class Lands(model_abstract):
//fields here
class Apartments(model_abstract):
//fields here
表格.py
class HomeForm(forms.ModelForm):
class Meta:
model = Home
class LandForm(forms.ModelForm):
class Meta:
model = Lands
class ApartmentForm(forms.ModelForm):
class Meta:
model = Apartments
真的,这些应该是凯瑟琳的表演,每个类别都有单独的模型,但是:
这可能不是您想要的,因为您似乎对所有类别都有 1 个表,根据类别显示不同的字段。
这是一个非常不优雅的设计,但如果类别与其他对象相关联并且您不想处理将多个不同模型与同一可能领域中的另一个模型绑定的复杂性,我可以看到它很方便(抽象关系很有趣,但很脏)。
在你自己的看法
只需为每个类别编写不同的表格,并在需要的地方使用适当的表格。
from forms HouseForm, LandForm, ApartmentForm
if category.name == 'homes':
form = HouseForm()
elif category.name == 'lands':
form = LandForm()
else:
form = ApartmentForm()
管理员更棘手
您需要为每个类别类型定义一个模型表单,重载模型表单的字段属性以仅显示您关心的字段。然后,您可以覆盖 ModelAdmin 的表单方法以显示不同的表单。像这样的东西:
class AdminHouseForm(forms.ModelForm):
class Meta:
model = Category
fields = ['field_one']
class AdminLandForm(forms.ModelForm):
class Meta:
model = Category
fields = ['field_two']
class AdminApartmentForm(forms.ModelForm):
class Meta:
model = Category
fields = ['field_two']
class CatgeoryAdmin(admin.ModelAdmin):
form = property(lambda cat: AdminLandForm if cat.name == 'lands' else AdminApartmentForm if cat.name == 'apartment' else AdminHouseForm)
我不是 100% 的表单覆盖,但这应该是一个开始。
你会遇到问题,因为在创建时,类别的类型直到保存后才知道。不过应该有办法解决这个问题。