【问题标题】:Django Model Forms with Multi-Level Foreign Keys具有多级外键的 Django 模型表单
【发布时间】:2020-11-07 08:37:13
【问题描述】:

我需要在 Django 中创建一个模型表单,并且有以下任意场景。

Real Estates
============
ID
...some extra fields...
CityID

Cities
======
ID
Name

Region
======
ID
Name

Country
=======
ID
Name

我想做的是让用户首先选择国家,然后是地区,最后是城市。 (在用户选择父类别后,使用 javascript 填充子类别。)但是,我不想将“地区”和“国家”字段添加到“房地产”表中。字段的顺序也很重要,即 1) Country、2) Region 和 3) City。

您能提出任何解决方法吗?谢谢!

【问题讨论】:

    标签: django forms model


    【解决方案1】:

    我假设您试图在用户选择国家后向用户显示一组有限的“地区”选项,并在用户选择地区后向用户显示一组有限的“城市”选项,以便提供一种方式明智地为房地产选择一个城市,而不是从一长串随机城市中挑选一些东西?

    您可以在 RealEstate ModelForm 上指定其他字段,这些字段不是 RealEstate 模型上的实际字段,并在表单的 .__init__() 中提供逻辑,如果需要,还可以在 .clean().save() 方法中提供额外的处理字段。也许是这样的:

    class Country(models.Model):
       name = models.CharField(...)
    
    class Region(models.Model):
       name = models.CharField(...)
       country = models.ForeignKey(Country, on_delete=models.CASCADE)
    
    class City(models.Model):
       name = models.CharField(...)
       region = models.ForeignKey(Region, on_delete=models.CASCADE)
    
    class RealEstate(models.Model):
       name = models.CharField(...)
       city = models.ForeignKey(City, on_delete=models.CASCADE)
    
    
    class RealEstateForm(forms.ModelForm):
       country = forms.ChoiceField(required=False)
       region = forms.ChoiceField(required=False)
    
       class Meta:
           model = RealEstate
           fields = ['name', 'city', 'country', 'region']
    
       def __init__(self, *args, **kwargs):
           super().__init__(*args, **kwargs)
           self.fields['country'].choices = Country.objects.all().values('id', 'name)
           self.fields['region'].choices = Region.objects.all().values('id', 'name', 'country__id')
           self.fields['city'].choices = City.objects.all().values('id', 'name', 'region__id', 'region__country__id')
    
    

    提供包含每个城市的参考区域 ID 和国家/地区 ID 的选项将允许您在前端过滤这些选项,如果您在用户选择国家和地区时设法使用这些选项,而无需发出单独的后端请求获取过滤后的列表。当然,您最终会以这种方式一次性发送更大的响应 - 如果您的数据集规模非常大(有多少国家、多少地区、多少城市),这可能是不需要的。

    【讨论】:

    • 非常感谢您的回答,彼得。你添加的字段,国家和地区应该是ChoiceFields吧?不是整数字段。
    • 嗨,彼得!只是另一个小修正。我猜返回元组列表的函数是“values_list”,而不是“values”。所以应该是 Country.objects.values_list('id', 'name)
    猜你喜欢
    • 2012-03-16
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2011-11-15
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多