【问题标题】:Many categorys. How to design model if I want different form to each category?很多类别。如果我想为每个类别提供不同的形式,如何设计模型?
【发布时间】:2013-02-25 08:47:26
【问题描述】:

我有很多类别:

  • 土地
  • 公寓

如果我想为每个类别提供不同的形式,如何设计模型(最佳)?每个类别都有不同的字段(有些重复)

【问题讨论】:

  • 不同的形式,在哪里?在管理员中还是在您的应用程序中?
  • @JackShedd 在管理员和我的应用程序中

标签: django database-design models


【解决方案1】:

模型.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

【讨论】:

  • 值得注意的是,这意味着您不能(轻松)做任何应该对所有房屋、土地和公寓通用的事情,而这可能很方便。在这种情况下,您想使用multi-table inheritance,尽管这会带来其自身的复杂性。
  • 你的回答没有错,我赞成!我只是指出这种方法有一些缺点,并链接到有关具有不同优点/缺点的类似方法的文档。
  • @Dougal 对不起,谢谢你告诉我。是的,所有继承都有优点和缺点。我看过这本书,这只是所有4个模型继承中最好的继承
  • @Dougal 它只有一个缺点,那就是“它不能单独使用父类”。你有更好的主意吗?这是我现在唯一能想到的。
【解决方案2】:
  1. 真的,这些应该是凯瑟琳的表演,每个类别都有单独的模型,但是:

  2. 这可能不是您想要的,因为您似乎对所有类别都有 1 个表,根据类别显示不同的字段。

  3. 这是一个非常不雅的设计,但如果类别与其他对象相关联并且您不想处理将多个不同模型与另一个模型绑定到相同的可能领域(抽象关系很有趣,但很脏)。

在你自己的观点中

只需为每个类别编写不同的表格,并在需要的地方使用适当的表格。

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% 使用该表单覆盖,但这应该是一个开始。

您会遇到问题,因为在创建时,直到保存后才能知道类别的类型。不过应该有办法解决这个问题。

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 1970-01-01
    • 2020-08-04
    • 2018-05-09
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多