I cant tell where there is an error in my code. It just doesnt work as expected. My views.py
JavaScript
x
5
1
def load_cities(request):
2
year_id = request.GET.get('year')
3
terms = Term.objects.filter(school=request.user.school).filter(year_id=year_id).order_by('name')
4
return render(request, 'city_dropdown_list_options', {'terms': terms})
5
My models.
JavaScript
1
17
17
1
class Year(models.Model):
2
3
school = models.ForeignKey(School,on_delete=models.CASCADE)
4
year = models.CharField(max_length=200,unique=True)
5
6
class Term(models.Model):
7
school = models.ForeignKey(School,on_delete=models.CASCADE)
8
year = models.ForeignKey(Year,on_delete=models.CASCADE)
9
name = models.CharField(max_length=200,unique=True)
10
11
class Exam(models.Model):
12
school = models.ForeignKey(School,on_delete=models.CASCADE)
13
year = models.ForeignKey(Year,on_delete=models.SET_NULL, null=True)
14
term = models.ForeignKey(Term,on_delete=models.SET_NULL, null=True)
15
name = models.CharField(max_length=20)
16
form = models.ManyToManyField(FormModel)
17
My forms.py
JavaScript
1
48
48
1
class NewExamForm(forms.ModelForm):
2
class Meta:
3
model = Exam
4
fields = ("year","term","name","school","form")
5
6
widgets = {
7
'school':forms.TextInput(attrs={"class":'form-control','value':'','id':'identifier','type':'hidden'}),
8
"year":forms.Select(attrs={"class":'form-control'}),
9
"name":forms.TextInput(attrs={"class":'form-control'}),
10
"form":forms.Select(attrs={"class":'form-control'}),
11
12
}
13
def __init__(self, school, *args, **kwargs):
14
super(NewExamForm, self).__init__(*args, **kwargs)
15
16
17
self.fields['year'] = forms.ModelChoiceField(
18
queryset=Year.objects.filter(school=school))
19
20
self.fields['term'].queryset = Term.objects.none()
21
22
self.fields['form'] = forms.ModelMultipleChoiceField(
23
queryset=FormModel.objects.filter(school=school),
24
widget=forms.CheckboxSelectMultiple,
25
required=True)
26
27
if 'year' in self.data:
28
try:
29
year = int(self.data.get('year'))
30
self.fields['term'].queryset = Term.objects.filter(school=school).filter(year_id=year).order_by('name')
31
except (ValueError, TypeError):
32
pass # invalid input from the client; ignore and fallback to empty City queryset
33
elif self.instance.pk:
34
self.fields['term'].queryset = self.instance.year.term_set.order_by('name')
35
36
The template
37
38
<div class="form-group">
39
<form method="post" id="examForm" data-cities-url="{% url 'ajax_load_cities' %}" novalidate enctype="multipart/form-data">
40
{% csrf_token %}
41
<table>
42
{{ form|crispy }}
43
</table>
44
<button type="submit">Save</button>
45
</form>
46
47
</div>
48
I have tried but it works only after I select a year and refresh manually with the year selcted, that’s when the terms appear.
I tried following the code by Vitor Freitas but couldn’t get it working. Anyone with the knowhow to assist.
Advertisement
Answer
I got it working by making corrections on the script as directed by @evergreen.
JavaScript
1
19
19
1
<script>
2
3
$("#id_year").change(function () {
4
var url = $("#examForm").attr("term-data");
5
var yearId = $(this).val();
6
7
$.ajax({
8
url: url,
9
data: {
10
'year': yearId
11
},
12
success: function (data) {
13
$("#id_term").html(data);
14
}
15
});
16
17
});
18
</script>
19