ModelForms ForeignKeys和Django

时间:2013-08-13 16:14:03

标签: django django-models django-forms

我有一个具有以下型号的应用

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)任务?

2 个答案:

答案 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)

然后将上下文传递给表单将有所帮助。