如何根据外键过滤表单?

时间:2021-01-09 09:19:21

标签: django django-filter

如何过滤 TopForm 中的字段,以便在用户选择教师时,所有其他字段自动向教师显示相关值。假设 Adam 是老师,并且在第四学期在网络部门教授网络编程(添加到管理员中)。现在用户选择Adam,当Adam选择时,部门下拉列表只显示与Adam等相关的Network。

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)

1 个答案:

答案 0 :(得分:0)

您可以使用带有 api 的 js 来执行此操作。 api、graphene_djangodjango-rest-framework 的示例。并在您的模板上使用 VueJS。当用户选择一位老师时,您会向您的 api 发送获取请求。您的 api 响应数据成为其他选择框的项目。例如代码:

在模板.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>

选择一名教师时,您的元素运行此功能:

    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')
      });
    },
相关问题