私は次のようなDjangoモデルを持っています:
class hotel(models.Model):
name = models.CharField(max_length=60)
city = models.ForeignKey('city', on_delete=models.DO_NOTHING)
state = models.ForeignKey('state', on_delete=models.DO_NOTHING)
country = models.ForeignKey('country', on_delete=models.DO_NOTHING)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "hotels"
class city(models.Model):
name = models.CharField(max_length=60)
state = models.ForeignKey('state', on_delete=models.DO_NOTHING)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "cities"
class state(models.Model):
name = models.CharField(max_length=60)
country = models.ForeignKey('country', on_delete=models.DO_NOTHING)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "states"
class country(models.Model):
name = models.CharField(max_length=60)
code = models.CharField(max_length=160)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "countries"
そして、ModelFormは次のようになります。
class Hotel(ModelForm):
class Meta:
model = hotel
fields = '__all__'
[編集] Hotel ModelFormからフォームオブジェクトを作成すると、Djangoは外部キーフィールドの値を自動的に入力します。やめたい。
例えば:
form = Hotel()
(Djangoは都市、州、国の値を自動入力します)
Djangoテンプレートですべての国の値をドロップダウンで返すようにしますが、州と都市のドロップダウンでは返しません(したがって、州と都市のドロップダウンをDjangoテンプレートで空のままにしておきます)。どうやってやるの?
PS-これを行う目的は、最初に国の値をロードすることです。ユーザーが選択した国に従って、州、次に都市をロードします。
form__init__
メソッドで選択肢をオーバーライドするか、フィールドが定義された直後に選択肢を設定するためのちょっとしたトリックを使用できます。
class Hotel(ModelForm):
class Meta:
model = hotel
fields = '__all__'
# Like this
state = forms.ModelChoiceField(state.objects.all())
state.choices = []
city = forms.ModelChoiceField(city.objects.all())
city.choices = []
# Or like this...
def __init__(self, data=None, *args, **kwargs):
super().__init__(data=data, *args, **kwargs)
if not data:
self.fields['state'].queryset = state.objects.none()
self.fields['city'].queryset = state.objects.none()
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加