0

私は多くのカテゴリを持っています:

  • 土地
  • アパート

カテゴリごとに異なるフォームが必要な場合、モデルを (最適に) 設計するにはどうすればよいですか? 各カテゴリには異なるフィールドがあります (いくつかの繰り返し)

4

2 に答える 2

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
于 2013-02-25T08:57:11.787 に答える
1
  1. 本当に、これらはキャサリンが示すように、カテゴリごとにモデルを分ける必要がありますが、次のとおりです。

  2. すべてのカテゴリに対して 1 つのテーブルがあり、カテゴリが何であるかに応じて異なるフィールドが表示されているように見えるため、これはおそらくあなたが望むものではありません。

  3. これは非常に洗練されていない設計ですが、カテゴリが他のオブジェクトに関連付けられていて、複数の異なるモデルを同じ可能性のあるフィールド内の別のモデルに関連付ける複雑さに対処する必要がない場合 (要約)関係は楽しいですが、汚いです)。

自分の意見で

カテゴリーごとに異なるフォームを作成し、必要に応じて適切なフォームを使用してください。

from forms HouseForm, LandForm, ApartmentForm

if category.name == 'homes':
    form = HouseForm()
elif category.name == 'lands':
    form = LandForm()
else:
    form = ApartmentForm()

管理者はよりトリッキーです

カテゴリ タイプごとにモデルフォームを定義し、必要なフィールドのみを表示するためにモデルフォームの 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% ではありませんが、それが出発点になるはずです。

作成時にカテゴリの TYPE が保存されるまでわからないため、問題が発生することになります。ただし、それを回避する方法があるはずです。

于 2013-02-25T09:17:50.563 に答える