You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤QuerySet仅显示刚创建的Assignment,实现Criteria自动关联

解决方案

1. 修正Assignment创建视图的跳转逻辑

原视图的固定success_url无法传递刚创建的Assignment ID,需要重写get_success_url方法,在实例创建完成后获取其ID并拼接到跳转地址中:

class assignmentCreateView(CreateView):
    model = Assignment
    template_name = 'markingApp/createAssignment.html'
    fields = ["assignmentName"]

    def get_success_url(self):
        # 创建成功后,携带刚生成的assignment ID跳转到评分标准创建页
        return reverse('criteria-create', kwargs={'assignment_pk': self.object.pk})

2. 配置URL路由

修改urls.py,让评分标准创建页面的路由接收assignment_pk参数:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path('assignment/create/', views.assignmentCreateView.as_view(), name='assignment-create'),
    path('criteria/create/<int:assignment_pk>/', views.criteria_create_view, name='criteria-create'),
]

3. 修改Criteria表单集视图

在视图中接收assignment_pk,获取对应的Assignment实例,然后隐藏表单中的关联字段,自动为每个表单绑定刚创建的Assignment:

# views.py
from django import forms
from django.forms import modelformset_factory
from django.shortcuts import get_object_or_404, redirect, render
from .models import Criteria, Assignment

def criteria_create_view(request, assignment_pk):
    # 获取刚创建的Assignment实例(用get_object_or_404避免无效ID报错)
    assignment = get_object_or_404(Assignment, pk=assignment_pk)
    
    # 自定义表单,只显示评分标准描述字段,隐藏关联的Assignment字段
    class CriteriaForm(forms.ModelForm):
        class Meta:
            model = Criteria
            fields = ('criteriaDescription',)

    # 创建表单集,使用自定义表单,设置默认显示3个空表单(可根据需求调整extra值)
    CriteriaFormSet = modelformset_factory(
        Criteria,
        form=CriteriaForm,
        extra=3
    )

    if request.method == 'POST':
        formset = CriteriaFormSet(request.POST)
        if formset.is_valid():
            # 批量保存时自动绑定Assignment
            instances = formset.save(commit=False)
            for instance in instances:
                instance.assignmentID = assignment
                instance.save()
            # 保存完成后跳转(示例跳转到Assignment详情页)
            return redirect('assignment-view')
    else:
        # 初始加载时设置queryset为空,避免显示已有评分标准
        formset = CriteriaFormSet(queryset=Criteria.objects.none())
    
    return render(request, 'markingApp/createCriteria.html', {'formset': formset, 'assignment': assignment})

4. 调整模板文件

在createCriteria.html中渲染表单集,同时可以显示当前关联的Assignment名称:

<!-- createCriteria.html -->
<h3>为 {{ assignment.assignmentName }} 添加评分标准</h3>
<form method="POST">
    {% csrf_token %}
    {{ formset.management_form }}
    {% for form in formset %}
        <div class="form-group">
            {{ form.as_p }}
        </div>
    {% endfor %}
    <button type="submit" class="btn btn-primary">保存评分标准</button>
</form>

原报错原因说明

你之前尝试用<a href="{% url 'criteria-create' Assignment.id %}">跳转时,Assignment还未通过表单提交创建,Assignment.id是空值,导致Django无法完成URL反向解析,因此抛出错误。正确逻辑是先提交表单创建Assignment,在视图中拿到生成的ID后再跳转。


内容的提问来源于stack exchange,提问作者BaileyLylyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:57:23