我有一个具有以下型号的应用
models.py
class Student (models.Model):
first_name = models.CharField(max_length=40, default='')
second_name = models.CharField(max_length=40, default='')
#more fields here
class Paper (models.Model):
#more fields here
student = models.ForeignKey(Student)
class StudentPayment(models.Model):
student = models.ForeignKey(Student)
paper = models.ForeignKey(Paper)
我创建了我的ModelForms,用于以非常简单的方式添加新学生和论文
#forms.py
class StudentForm(forms.ModelForm):
class Meta:
model = Student
class PaperForm(forms.ModelForms):
class Meta:
model = Paper
class StudentPaymentForm(forms.ModelForms):
class Meta:
model = StudentPayment
学生支付特定纸张的费用。我使用ModelForms生成一个表单,为学生添加纸张或付款。创建StudentPaymentForm时,纸张的选择字段包含数据库中添加的所有纸张。有没有办法让纸张选择字段仅包含特定选定学生的论文(来自学生选择字段),还是一个jquery(或ajax)任务?
答案 0 :(得分:2)
Django将为student属性创建默认ModelChoiceField
。可以更改ModelChoiceField
的查询集。最好的方法可能是在表单的__init__
方法中:
class StudentPaymentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
student_queryset = kwargs.pop('paper_queryset', None)
super(StudentPaymentForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['paper'].queryset = self.instance.student.paper_set.all()
elif paper_queryset:
self.fields['paper'].queryset = paper_queryset
这将只允许与特定学生实例相关的论文。但是,当你选择另一个学生时,它不会神奇地更新你的选择,你需要Ajax / jQuery。但是,当您选择不属于您所选学生的论文时,您将收到验证错误,并且在您尝试提交表单后,您将获得所选学生的更新选项(和它返回错误)。
答案 1 :(得分:0)
我认为运行像
这样的查询context['paper'] = Paper.objects.filter(student=self.request.user)
然后将上下文传递给表单将有所帮助。