I am trying to use the result of a selection as input to another selection. I have been working on this for three weeks, and I cannot find a simple answer.
Here are my models:
from django.db import models
# Create your models here.
class School(models.Model):
id = models.CharField(primary_key=True, max_length=10)
school_name = models.CharField(max_length=80)
def __str__(self):
return(f"{self.id} {self.school_name}")
return self.id
class Meta:
ordering = ['id']
indexes = [
models.Index(fields=['id', 'school_name']),
]
class Courses(models.Model):
id = models.CharField(primary_key=True, max_length=12)
created_at = models.DateTimeField(auto_now_add=True)
school = models.ForeignKey(School, on_delete=models.PROTECT, related_name='school')
name = models.CharField(max_length=150, null=True, blank=True)
cost = models.CharField(max_length=75, null=True, blank=True)
class Meta:
ordering = ['id']
indexes = [ models.Index(fields=['school']), models.Index(fields=['name', 'id'])]
def __str__(self):
return(f"{self.school} {self.name}")
return self.name
class Student(models.Model):
course = models.ForeignKey(Courses, on_delete=models.PROTECT)
created_at = models.DateTimeField(auto_now_add=True)
student_id = models.CharField(max_length=20, null=True, blank=True)
class Meta:
ordering = ['course']
indexes = [
models.Index(fields=['course']),
]
And my views:
def choose_school3(request):
if request.user.is_authenticated:
aschool = Courses.objects.all()
form=SelectSchoolForm(request.POST)
if request.method == "POST":
if form.is_valid():
data = form.cleaned_data
choice = data['school']
selected_school = Courses.objects.filter(school=choice).values()
context = {'choice': choice}
return render(request, 'add_student2b.html', context)
context = {'form': form, 'aschool':aschool}
return render(request, 'choose_school3.html', context)
else:
messages.success(request, "You Must Be Logged In To View Records!")
return redirect('main')
def add_student2b(request, choice):
chosen_school = Courses.objects.filter(school=choice).values()
form = AddStudentForm(request.POST)
context = {'form':form, 'choice':choice, 'chosen_school':chosen_school}
return render(request, 'add_student2b.html', context)
def add_student5(request, pk):
if request.user.is_authenticated:
choice = School.objects.get(id=pk)
courses = Courses.objects.filter(school=choice)
form = modelformset_factory(Student, fields=['course','student_id'], formset=AddStudentForm2FormSet)
context = {'courses':courses, 'choice':choice, 'form':form}
return render(request, 'add_student5.html', context)
else:
messages.success(request, "You Must Be Logged In To View Records!")
return redirect('main')
The forms:
class SelectSchoolForm(forms.ModelForm):
class Meta:
model = Courses
fields = ('school', )
labels = {'school':'School', }
widgets = {'school': forms.Select(attrs={"placeholder":"School", "class":"form-select"}),
}
class AddStudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ( 'student_id', )
labels = {'student_id':'',}
widgets = {'student_id':forms.widgets.TextInput(attrs={"placeholder":"Student ID", "class":"form-control"}),
}
class AddStudentForm2FormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
super().__init__(self, *args, **kwargs)
self.fields['course'].queryset = Student.objects.filter(all)
and html:
choose_school3.html:
<form class="row g-3" action="{% url 'choose_school3' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<div class="col-md-6">
{{ form.as_p }}
</div>
<div class="col-md-6">
<button type="submit" class="btn btn-secondary">Choose School</button>
<a href="{% url 'school' %}" class="btn btn-success">Back</a>
</div>
</form>
add_student2b.html:
<form class="row g-3" action="{% url 'choose_school' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<div class="col-md-6">
{{ form.as_p }}
</div>
<div class="col-md-6">
<a class="btn btn-secondary btn-lg" href="{% url 'add_student5' choice.id %}" role="button">Add Student</a>
<a href="{% url 'school' %}" class="btn btn-success">Back</a>
</div>
</form>
and add_student5.html:
<form class="row g-3" action="{% url 'choose_school' %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<div class="col-md-6">
{{ form.as_p }}
</div>
<div class="col-md-6">
<a class="btn btn-secondary btn-lg" href="{% url 'add_student5' choice.id %}" role="button">Add Student</a>
<a href="{% url 'school' %}" class="btn btn-success">Back</a>
</div>
</form>
Everything I try sends me to an error. This most recent incarnation gives me this:
cannot unpack non-iterable builtin_function_or_method object
referring to the {{ form.as_p }} tag. I’ve been going in circles and down rabbit holes. Is it possible to do this with Django (and without JS or other things) or not? Please help.
1