Django模型选择字段:巨大的选择列表

Django模型选择字段:巨大的选择列表,django,django-forms,Django,Django Forms,考虑以下3种模式: # models.py class City(models.Model): name = models.CharField(max_length=50) class Institute(models.Model): name = models.CharField(max_length=100) city = models.ForeignKey(City) class Student(models.Model): name = models.

考虑以下3种模式:

# models.py
class City(models.Model):
    name = models.CharField(max_length=50)

class Institute(models.Model):
    name = models.CharField(max_length=100)
    city = models.ForeignKey(City)

class Student(models.Model):
    name = models.CharField(max_length=60)
    roll = models.CharField(max_length=10)
    institute = models.ForeignKey(Institute)
现在我正在创建一个模型表单来添加/编辑学生,但我为用户提供了选择城市和学院的选项。因此,基本上,当用户选择城市时,相应的机构会使用JavaScript显示

# forms.py
class StudentForm(forms.ModelForm):
    city = forms.ModelChoiceField(City)
    institute = forms.ModelChoiceField(queryset=Institute.objects.all())

class Meta:
    model = Student
但研究所的数量超过3000个。因此,我想要的是在institute字段中最初将选项保留为空(因为一旦用户选择了一个城市,它们将由JavaScript填充),但是在提交数据时,我会得到一个“Select a valid choice”验证错误。有什么办法解决这个问题吗


注意:当我没有指定选项(对于institute字段)时,网页大小为300KB,当我指定它们时,网页大小为1.1MB

您应该确保在选择框中填充的
institute
值也应该具有主键作为html
id
属性,我必须覆盖Choice小部件,并将其呈现方法更改为不显示选项。由于仍然提供choices参数,因此不会出现验证错误,我可以自由使用javascript呈现所选城市的研究所。

我也有同样的问题,但通过将widget.choices设置为[]克服了这个问题

class StudentForm(forms.ModelForm):
    city = forms.ModelChoiceField(City)
    institute = forms.ModelChoiceField(queryset=Institute.objects.all())

def __init__(self, *args, **kwargs):
    super(StudentForm, self).__init__(*args, **kwargs)
    self.fields['institute'].widget.choices = []

你能同时显示JavaScript代码吗?我遇到了完全相同的问题。要解决这个问题,您只需将institute字段的选项设置为空列表。索亚茨的答案是正确的。