【问题标题】:How do I set a foreignkey field in Django models to return no values?如何在 Django 模型中设置外键字段以不返回任何值?
【发布时间】:2019-12-30 09:40:59
【问题描述】:

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

【问题讨论】:

  • 不使用fields='__all__',而是指定要从数据库加载值的字段。一个简单的例子就是simpleisbetterthancomplex.com/tutorial/2018/01/29/…
  • 是的。我可以使用“排除”并为州和城市手动编写 html 元素,但我想在我的视图中使用 Django 的预定义表单元素。
  • 知道了。我链接的示例具有与接受的答案类似的空下拉列表示例代码。 :)

标签: python django django-templates modelchoicefield


【解决方案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()

【讨论】:

  • 谢谢你,Lain。 forms.ModelChoiceField(state.objects.all()) 中的表单是什么?
猜你喜欢
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 2010-10-18
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 2012-05-10
相关资源
最近更新 更多