为什么依赖于 Django 的下拉菜单不起作用
Why django dependent dropdownn is not working
我不知道我的代码哪里有错误。它只是没有按预期工作。
我的 views.py
def load_cities(request):
year_id = request.GET.get('year')
terms = Term.objects.filter(school=request.user.school).filter(year_id=year_id).order_by('name')
return render(request, 'city_dropdown_list_options', {'terms': terms})
我的模型。
class Year(models.Model):
school = models.ForeignKey(School,on_delete=models.CASCADE)
year = models.CharField(max_length=200,unique=True)
class Term(models.Model):
school = models.ForeignKey(School,on_delete=models.CASCADE)
year = models.ForeignKey(Year,on_delete=models.CASCADE)
name = models.CharField(max_length=200,unique=True)
class Exam(models.Model):
school = models.ForeignKey(School,on_delete=models.CASCADE)
year = models.ForeignKey(Year,on_delete=models.SET_NULL, null=True)
term = models.ForeignKey(Term,on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=20)
form = models.ManyToManyField(FormModel)
我的forms.py
class NewExamForm(forms.ModelForm):
class Meta:
model = Exam
fields = ("year","term","name","school","form")
widgets = {
'school':forms.TextInput(attrs={"class":'form-control','value':'','id':'identifier','type':'hidden'}),
"year":forms.Select(attrs={"class":'form-control'}),
"name":forms.TextInput(attrs={"class":'form-control'}),
"form":forms.Select(attrs={"class":'form-control'}),
}
def __init__(self, school, *args, **kwargs):
super(NewExamForm, self).__init__(*args, **kwargs)
self.fields['year'] = forms.ModelChoiceField(
queryset=Year.objects.filter(school=school))
self.fields['term'].queryset = Term.objects.none()
self.fields['form'] = forms.ModelMultipleChoiceField(
queryset=FormModel.objects.filter(school=school),
widget=forms.CheckboxSelectMultiple,
required=True)
if 'year' in self.data:
try:
year = int(self.data.get('year'))
self.fields['term'].queryset = Term.objects.filter(school=school).filter(year_id=year).order_by('name')
except (ValueError, TypeError):
pass # invalid input from the client; ignore and fallback to empty City queryset
elif self.instance.pk:
self.fields['term'].queryset = self.instance.year.term_set.order_by('name')
The template
<div class="form-group">
<form method="post" id="examForm" data-cities-url="{% url 'ajax_load_cities' %}" novalidate enctype="multipart/form-data">
{% csrf_token %}
<table>
{{ form|crispy }}
</table>
<button type="submit">Save</button>
</form>
</div>
我已经尝试过了,但只有在我 select 一年后它才有效,并用选择的年份手动刷新,那是条款出现的时候。
我尝试按照 Vitor Freitas 的代码进行操作,但无法正常工作。任何知道如何提供帮助的人。
我按照@evergreen 的指示通过对脚本进行更正来使其正常工作。
<script>
$("#id_year").change(function () {
var url = $("#examForm").attr("term-data");
var yearId = $(this).val();
$.ajax({
url: url,
data: {
'year': yearId
},
success: function (data) {
$("#id_term").html(data);
}
});
});
</script>
我不知道我的代码哪里有错误。它只是没有按预期工作。 我的 views.py
def load_cities(request):
year_id = request.GET.get('year')
terms = Term.objects.filter(school=request.user.school).filter(year_id=year_id).order_by('name')
return render(request, 'city_dropdown_list_options', {'terms': terms})
我的模型。
class Year(models.Model):
school = models.ForeignKey(School,on_delete=models.CASCADE)
year = models.CharField(max_length=200,unique=True)
class Term(models.Model):
school = models.ForeignKey(School,on_delete=models.CASCADE)
year = models.ForeignKey(Year,on_delete=models.CASCADE)
name = models.CharField(max_length=200,unique=True)
class Exam(models.Model):
school = models.ForeignKey(School,on_delete=models.CASCADE)
year = models.ForeignKey(Year,on_delete=models.SET_NULL, null=True)
term = models.ForeignKey(Term,on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=20)
form = models.ManyToManyField(FormModel)
我的forms.py
class NewExamForm(forms.ModelForm):
class Meta:
model = Exam
fields = ("year","term","name","school","form")
widgets = {
'school':forms.TextInput(attrs={"class":'form-control','value':'','id':'identifier','type':'hidden'}),
"year":forms.Select(attrs={"class":'form-control'}),
"name":forms.TextInput(attrs={"class":'form-control'}),
"form":forms.Select(attrs={"class":'form-control'}),
}
def __init__(self, school, *args, **kwargs):
super(NewExamForm, self).__init__(*args, **kwargs)
self.fields['year'] = forms.ModelChoiceField(
queryset=Year.objects.filter(school=school))
self.fields['term'].queryset = Term.objects.none()
self.fields['form'] = forms.ModelMultipleChoiceField(
queryset=FormModel.objects.filter(school=school),
widget=forms.CheckboxSelectMultiple,
required=True)
if 'year' in self.data:
try:
year = int(self.data.get('year'))
self.fields['term'].queryset = Term.objects.filter(school=school).filter(year_id=year).order_by('name')
except (ValueError, TypeError):
pass # invalid input from the client; ignore and fallback to empty City queryset
elif self.instance.pk:
self.fields['term'].queryset = self.instance.year.term_set.order_by('name')
The template
<div class="form-group">
<form method="post" id="examForm" data-cities-url="{% url 'ajax_load_cities' %}" novalidate enctype="multipart/form-data">
{% csrf_token %}
<table>
{{ form|crispy }}
</table>
<button type="submit">Save</button>
</form>
</div>
我已经尝试过了,但只有在我 select 一年后它才有效,并用选择的年份手动刷新,那是条款出现的时候。
我尝试按照 Vitor Freitas 的代码进行操作,但无法正常工作。任何知道如何提供帮助的人。
我按照@evergreen 的指示通过对脚本进行更正来使其正常工作。
<script>
$("#id_year").change(function () {
var url = $("#examForm").attr("term-data");
var yearId = $(this).val();
$.ajax({
url: url,
data: {
'year': yearId
},
success: function (data) {
$("#id_term").html(data);
}
});
});
</script>