根据Django中的其他字段修改表单字段

问题描述

我有一个包含多个字段的表单。假设其中一个是“subjects”,一个多选选择字段,另一个是“main_subject”,一个单选选择字段。如果选择了相应的“main_subject”,我应该如何编码 views.py 文件自动选择“主题”中的主题? (我不想为学生保存一个主要科目,如果它没有作为他的科目之一)。

models.py

class Subject(models.Model):
    subject=models.CharField(primary_key=True,max_length=100)

class Student(models.Model):
    name=models.CharField(primary_key=True,max_length=100)
    main_subject=models.ForeignKey(Subject,on_delete=models.SET_NULL,null=True)

class StudentSubject(models.Model):
    id = models.UUIDField(primary_key=True,default=uuid.uuid4,editable=False)
    name = models.ForeignKey(Student,on_delete=models.CASCADE)
    subject = models.ForeignKey(discipline,on_delete=models.CASCADE)
    class Meta:
        constraints = [models.UniqueConstraint(fields=['name ','subject '],name='uniqueStudentSubject')]

forms.py

class NewStudentForm(forms.ModelForm):
    class Meta:
        model=Student
        fields=['name','main_subject']
        widgets={'name': forms.Textinput(),'main_subject': forms.Select()}
    subjects = forms.ModelMultipleChoiceField(
                        widget=forms.CheckBoxSelectMultiple(),queryset=Subject.objects.all(),required=False
                        )

views.py

def new_student(request):
    if request.method == 'POST':
         form = NewStudentForm(request.POST)
    if form.is_valid():
         form.save(commit=True)
         for stu in form.cleaned_data['subjects']:
                StudentSubject.objects.create(
                    name=Project.objects.get(pk=request.POST['name']),subject=Subject.objects.get(pk=stu)
                    )
         # SOMETHING ELSE......... #

解决方法

正如@Deniz 所说,我认为它是由 JavaScript 完成的。直到几个小时前我才知道 JS,所以我不确定这是最好的解决方案,但对我来说,它有效。 只需将以下内容添加到 html 文件中即可(显然要考虑项目中每个元素的相应 ID):

<script type="text/javascript">
        var main_subject_list = document.getElementById("id_main_subject");
        main_subject_list.addEventListener("change",function() {
            for (var i = 0; i < main_subject_list.options.length; i++) {
                var option = main_subject_list.options[i];
                if (option.selected) {
                    var checkbox_to_select = document.getElementById("id_subject_" + (i - 1)).click();
                }
            }
        });

</script>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...