如何过滤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
相关产品推荐
相关产品推荐

