Как настроить поле внешнего ключа в моделях Django, чтобы оно не возвращало значений?

У меня есть модель 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__'

[EDIT] При создании объекта формы из Hotel ModelForm Django автоматически заполняет значения полей внешнего ключа. Я хочу остановить это.

Например:

form = Hotel() (Django автоматически заполняет значения города, штата и страны)

Я хочу, чтобы мой шаблон Django возвращал все значения страны в раскрывающемся списке, но не для раскрывающихся списков штатов и городов (поэтому я хочу, чтобы раскрывающиеся списки штатов и городов оставались пустыми в шаблоне Django). Как я могу это сделать?

PS. Целью этого является сначала загрузить значения страны, и в соответствии с выбором страны пользователем я буду загружать штат, а затем города соответственно.


person J J    schedule 30.12.2019    source источник
comment
Вместо использования fields='__all__' укажите поля, в которые вы хотите, чтобы значения загружались из БД. Простой пример будет похож на тот, который указан в простой лучше сложного.com/tutorial/2018/01/29/   -  person JRajan    schedule 30.12.2019
comment
Истинный. Я мог бы использовать «исключить» и вручную написать html-элементы для штата и города, но я хочу использовать предопределенные элементы формы Django в своих представлениях.   -  person J J    schedule 30.12.2019
comment
Понятно. Пример, который я связал, имел аналогичный код примера для пустых раскрывающихся списков в качестве принятого ответа. :)   -  person JRajan    schedule 31.12.2019


Ответы (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()
person Iain Shelvington    schedule 30.12.2019
comment
Спасибо, Лейн. Что такое формы в forms.ModelChoiceField(state.objects.all())? - person J J; 30.12.2019