私は多くのカテゴリを持っています:
- 家
- 土地
- アパート
カテゴリごとに異なるフォームが必要な場合、モデルを (最適に) 設計するにはどうすればよいですか? 各カテゴリには異なるフィールドがあります (いくつかの繰り返し)
私は多くのカテゴリを持っています:
カテゴリごとに異なるフォームが必要な場合、モデルを (最適に) 設計するにはどうすればよいですか? 各カテゴリには異なるフィールドがあります (いくつかの繰り返し)
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()
管理者はよりトリッキーです
カテゴリ タイプごとにモデルフォームを定義し、必要なフィールドのみを表示するためにモデルフォームの 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 が保存されるまでわからないため、問題が発生することになります。ただし、それを回避する方法があるはずです。