0

我有一个 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 - 这样做的目的是首先加载国家/地区值,根据用户选择的国家/地区,我将加载州,然后相应地加载城市。

4

1 回答 1

1

您可以在表单__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()
于 2019-12-30T09:50:35.410 回答