Django类视图报错:UpdateTeacherIssueForm缺失必填参数pk
错误原因
你的UpdateTeacherIssueForm表单的__init__方法要求必须传入pk参数,但视图的get_form_kwargs方法未传递该参数,导致触发「缺少必填位置参数pk」的错误。
解决方案
方案1:直接传递URL中的pk参数
修改视图的get_form_kwargs方法,从视图的self.kwargs中获取URL捕获的pk(Django基于类视图会自动将URL中的参数存入self.kwargs),并添加到表单的参数集合中:
class UpdateTeacherIssueView(LoginRequiredMixin,UpdateView): model = TeacherIssue form_class = UpdateTeacherIssueForm template_name = 'crud_forms/edit_teacher_issue.html' success_url = reverse_lazy('view_student') #To be changed def get_form_kwargs(self): kwargs = super(UpdateTeacherIssueView, self).get_form_kwargs() kwargs['school'] = self.request.user.school kwargs['issuer'] = self.request.user kwargs['pk'] = self.kwargs['pk'] # 新增:传递URL中的pk参数 return kwargs
方案2:利用表单instance简化逻辑(推荐)
在更新场景下,Django的UpdateView会自动将当前要修改的对象以instance参数传递给表单,你可以直接从instance中获取所需数据,无需额外传递pk:
- 修改表单代码:
class UpdateTeacherIssueForm(forms.ModelForm): """Edit TeacherIssue Form""" # 移除pk参数,从instance中获取数据 def __init__(self,*args, school, issuer, **kwargs): super().__init__(*args, **kwargs) self.fields['issuer'].initial = issuer self.fields['book_id'].queryset = Books.objects.filter(school=school,no_of_books=1).select_related('subject') # 从instance中获取borrower_teacher设置初始值 if self.instance: self.fields['borrower_teacher'].initial = self.instance.borrower_teacher class Meta: model = TeacherIssue fields = ['issuer','book_id','borrower_teacher','issue_date'] widgets = { 'borrower_teacher':forms.TextInput(attrs={"class":'form-control','type':'hidden'}), "issue_date":forms.TextInput(attrs={"class":"form-control"}), 'issuer':forms.TextInput(attrs={"class":'form-control','type':'hidden'}), 'book_id':Select2Widget(attrs={'data-placeholder': 'Select Book','data-width': '100%'},) }
- 视图恢复原有
get_form_kwargs代码(去掉pk相关注释行即可)。
内容的提问来源于stack exchange,提问作者fakeMake
相关产品推荐
相关产品推荐

