有没有办法以Django形式动态地过滤查询集以确保正确的外键?

问题描述 投票:0回答:1

我正在为此模型创建表格

class SemAssign(models.Model):
    staff = models.ForeignKey(User, on_delete=models.CASCADE)
    semester = models.ForeignKey(Subject, on_delete=models.CASCADE, default=1)

    def __str__(self):
        return f'{self.staff.username}'

和我的forms.py看起来像

class SemAssignForm(forms.ModelForm):
    class Meta:
        model = SemAssign
        fields = ['staff','semester']

并且我像views.py一样基于用户定义的过滤器进行了查询集>

def assign_sem(request):
    if request.user.is_staff:
        dept = request.GET.get('department')
        sem = request.GET.get('semester')
        form=SemAssignForm(request.POST)
        #form.fields['staff'].queryset = User.objects.filter(is_staff=True, profile__Department=dept)
        #form.fields['semester'].queryset = Subject.objects.filter(sem=sem)

        if form.is_valid():
            SemAssign=form.save()
            return redirect('dashboard')

当查询正常运行时,表单被确认为错误。并且,如果我不进行查询,则表单已成功验证。我确定我在查询外键集时丢失了某个地方。有人可以找我吗?

我的朋友建议我使用modelformset,但这不是我的范围。我只想基于SemAssign请求过滤器过滤GET模型的字段。

我正在为此模型类SemAssign(models.Model)创建一个表单:staff = models.ForeignKey(User,on_delete = models.CASCADE)学期= models.ForeignKey(Subject,on_delete = models.CASCADE,...] >

django django-models
1个回答
0
投票

您应该分离用于创建表单和处理提交的表单的代码。通常,第一个是GET,第二个是POST。所以像这样:

def assign_sem(request):
    if request.method == 'GET':
        # Your code to create the form and set the right querysets
    elif request.method == 'POST'::
        # Your code to check that the submitted form is valid and save it
© www.soinside.com 2019 - 2024. All rights reserved.