0

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

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

4

2 回答 2

2

Django 将为ModelChoiceField学生属性创建一个默认值。可以更改 a 的查询集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。但是,当您选择不属于您选择的学生的论文时,您将收到验证错误,并且一旦您尝试提交表格,您将获得所选学生的更新选项(和它返回错误)。

于 2013-08-13T16:38:34.920 回答
0

我认为运行类似的查询

context['paper'] = Paper.objects.filter(student=self.request.user)

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

于 2013-08-13T16:32:34.967 回答