【发布时间】:2013-02-25 08:47:26
【问题描述】:
我有很多类别:
- 家
- 土地
- 公寓
如果我想为每个类别提供不同的形式,如何设计模型(最佳)?每个类别都有不同的字段(有些重复)
【问题讨论】:
-
不同的形式,在哪里?在管理员中还是在您的应用程序中?
-
@JackShedd 在管理员和我的应用程序中
标签: django database-design models
我有很多类别:
如果我想为每个类别提供不同的形式,如何设计模型(最佳)?每个类别都有不同的字段(有些重复)
【问题讨论】:
标签: django database-design 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 个表,根据类别显示不同的字段。
这是一个非常不雅的设计,但如果类别与其他对象相关联并且您不想处理将多个不同模型与另一个模型绑定到相同的可能领域(抽象关系很有趣,但很脏)。
在你自己的观点中
只需为每个类别编写不同的表格,并在需要的地方使用适当的表格。
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% 使用该表单覆盖,但这应该是一个开始。
您会遇到问题,因为在创建时,直到保存后才能知道类别的类型。不过应该有办法解决这个问题。
【讨论】: