我有很多种类:
如果我想为每个类别提供不同的表单,如何设计模型(最佳)?每个类别都有不同的字段(一些重复)
答案 0 :(得分:3)
models.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
forms.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 :(得分:1)
真的,这些应该是凯瑟琳的节目,每个类别的单独模型,但是:
这可能不是你想要的,因为你似乎有1个表适用于所有类别,不同的字段显示取决于类别。
这是一个非常不优雅的设计,但是如果类别与其他对象相关联并且你不想处理将多个不同模型绑定到另一个模型的复杂性,我可以看到它很方便。同样可能的领域(抽象关系很有趣,但很脏)。
以自己的观点
只需为每个类别编写一个不同的表单,并使用适当的表单。
from forms HouseForm, LandForm, ApartmentForm
if category.name == 'homes':
form = HouseForm()
elif category.name == 'lands':
form = LandForm()
else:
form = ApartmentForm()
管理员比较棘手
您需要为每个类别类型定义一个模型表单,重载modelform的fields属性以仅显示您关注的字段。然后,您可以覆盖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%在表单覆盖上,但这应该是一个开始。
你会遇到问题,因为在创作之后,直到保存之后才知道类别的类型。应该有办法解决这个问题。