Django模型选择领域:巨大的选择清单

时间:2011-08-02 02:44:47

标签: 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.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个。所以我想要的是最初为学院领域保持选择空白(因为一旦用户选择了城市,它们将由JavaScript填充),但在提交数据时,我收到“选择有效选择”验证错误。有任何想法如何解决这个问题?

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

3 个答案:

答案 0 :(得分:1)

显然,我必须覆盖Choice小部件并更改其render方法以不显示任何选项。由于仍然提供了选择参数,因此不会发生验证错误,我可以自由地使用javascript来选择所选城市的研究所。

答案 1 :(得分:0)

您应该确保在选择框中填充的Institute值也应该将主键作为html id属性。

答案 2 :(得分:0)

我遇到了同样的问题,但是通过将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 = []