Django3工单编辑页调用TicketForm传instance参数报错如何解决?
问题根因
你的报错核心是TicketForm没有继承Django的ModelForm类:只有ModelForm支持instance参数用于绑定现有模型实例填充表单,普通的Form类初始化不接受instance参数,因此抛出参数不匹配错误。
你之前直接传入obj给TicketForm报错的原因也与此相关:普通Form的第一个位置参数是表单提交的data数据,Django会尝试调用该参数的get方法获取字段值,而Ticket模型实例没有get方法,因此抛出对应错误。
解决方案
步骤1:修正TicketForm定义
将你的Form类改为继承forms.ModelForm,关联Ticket模型并指定需要编辑的字段,示例代码如下:
from django import forms from .models import Ticket class TicketForm(forms.ModelForm): class Meta: model = Ticket # 此处列出所有需要在表单中编辑的模型字段 fields = ['issue_title', 'issue_description']
步骤2:修正Models.py中的语法错误
你当前的模型代码存在括号未闭合的问题,会导致运行报错,修正后代码如下:
class Ticket(models.Model): #---Base Meta----------------------------------------- appTicketID = models.AutoField(primary_key=True) date_submitted = models.DateTimeField( max_length=20, auto_now_add=True) issue_title = models.CharField(max_length=90) issue_description = models.CharField(max_length=1000) def __str__(self): return (f"{self.appTicketID} " f"{self.date_submitted} " f"{self.issue_title} " f"{self.issue_description} ") def get_absolute_url(self): return reverse_lazy('ticket-edit', kwargs={'aTicketID': self.appTicketID})
步骤3:优化视图冗余逻辑
你当前的视图代码存在重复查询、逻辑顺序错误的问题(判断aTicketID是否为None的逻辑写在查询之后,完全不会生效),优化后代码如下:
@login_required def ticket_edit(request, aTicketID): # 从url获取的aTicketID匹配正则\d+,不可能为None,不需要额外判断 obj = Ticket.objects.get(appTicketID=aTicketID) updateform = TicketForm(instance=obj) context = { "has_error": False, "updateform": updateform, "aticket": obj } return render(request,'appname/ticket-edit.html', context)
内容的提问来源于stack exchange,提问作者BCerveza
相关产品推荐
相关产品推荐

