Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
245 views
in Technique[技术] by (71.8m points)

django - How to filter form based on foreign key?

How can I filter fields in my TopForm in such a way that when a user selects a teacher, automatically all other fields show related values to the teacher. Suppose Adam is the teacher and in the Network department teaches network programming in the 4th semester(added in the admin). Now the user selects Adam, when Adam selected, the department dropdown shows only Network which is related to Adam and so on.

forms.py

class AnswerForm(ModelForm):
    class Meta:
        model = Student_Answer
        fields = ('answer',)
        labels = {'answer': ''}
        widgets = { 'answer': RadioSelect(choices=RATING_CHOICES)}


class TopForm(forms.Form):
    teacher = forms.ModelChoiceField(queryset=Teacher.objects.all())
    department = forms.ModelChoiceField(queryset=Department.objects.all())
    subject = forms.ModelChoiceField(queryset=Subject.objects.all())
    semester = forms.ModelChoiceField(queryset=Semester.objects.all())

models.py

class Question(models.Model):
    question = models.CharField(max_length=200)


class Department(models.Model):
    name = models.CharField(max_length=60)

class Semester(models.Model):
    num = models.IntegerField(choices=SEMESTER, default=1)

class Subject(models.Model):
    name = models.CharField(max_length=100)
    code = models.CharField(max_length=5, null=True)
    semester = models.ForeignKey(Semester, on_delete=models.CASCADE, null=True)
    department = models.ManyToManyField(Department)

class Teacher(models.Model):
    name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200, null=True)
    department = models.ManyToManyField(Department)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)

class Student_Answer(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    department = models.ForeignKey(Department, on_delete=models.CASCADE)
    semester = models.ForeignKey(Semester, on_delete=models.CASCADE)
    answer = models.SmallIntegerField(choices=RATING_CHOICES, default=None)
question from:https://stackoverflow.com/questions/65641033/how-to-filter-form-based-on-foreign-key

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

you can do this using js with an api. Example for api, graphene_django or django-rest-framework. And use VueJS on your template. When user selects a teacher you send get request to your api. Your api's response data becomes item for other select box. For example code:

in template.html

                  <div class="form-row">
                    <div class="col-md-12" style="padding-left:3px;">
                      <label for="id_faculty">Teachers</label>
                      <v-select :options="your_teachers" @input="selectTeacher($event)" label="name" v-model="selected_teacher"></v-select>
                    </div>
                  </div>
        <!-- Your deparments div begin --!>
                   <div class="form-row">
                    <div class="col-md-12" style="padding-left:3px;">
                      <label for="id_faculty">Deparments</label>
                      <v-select :options="departments" label="name" v-model="sselected_teacher_departments"></v-select>
                    </div>
                  </div>

when select a teacher your element run this function:

    getDepartment(){
      axios.get(url+'/api/?query={allDepartment{id, name}}').then((response) =>{
        this.department = response.data.data.allDepartment;
        this.loading = false;
      }).catch((error) => {
        console.log(error, 'for : getDepartment() function')
      });
    },

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...