在Django Form中编辑记录时出现问题



I每个人在根据问题id编辑记录时都遇到了问题,只有问题记录会自动显示聊天问题,选项记录不会自动显示,也许我的ORM错了在某个地方,即使我保存了出错的记录,也请帮助我。这是我做过的crud操作列表和添加记录,但这也很复杂,如果有人能做简单的话,这对我更有帮助。谢谢

models.py -这是所有3个型号

class Problem(models.Model):
Language = models.IntegerField(choices=Language_CHOICE, default=1)
type = models.CharField(max_length=500, null=True, blank=True)
def __str__(self):
return self.type

class ChatQuestion(models.Model):
question = RichTextField(null=True, blank=True)
problem_id = models.ForeignKey(
Problem,
models.CASCADE,
verbose_name='Problem',
)
sub_problem_id = models.ForeignKey(
SubProblem,
models.CASCADE,
verbose_name='Sub Problem',
null=True,
blank=True
)
def __str__(self):
return self.question

class Option(models.Model):
option_type = models.CharField(max_length=250, null=True, blank=True)
question_id = models.ForeignKey(
ChatQuestion,
models.CASCADE,
verbose_name='Question',
)
problem=models.ForeignKey(
Problem,
models.CASCADE,
verbose_name='Problem',
null=True,
blank=True
)
next_question_id = models.ForeignKey(ChatQuestion, on_delete=models.CASCADE, null=True, blank=True,
related_name='next_question')

表单.py

class Editchatbot(forms.Form):
problem=forms.ModelChoiceField(queryset=Problem.objects.all(), required=True, widget=forms.Select(attrs={'class': 'form-control select2'}))
question=forms.ModelChoiceField(queryset=ChatQuestion.objects.all(), required=True, widget=forms.Select(attrs={'class': 'form-control select2'}))
option=forms.ModelChoiceField(queryset=Option.objects.all(), required=True, widget=forms.Select(attrs={'class': 'form-control select2'}))
class Meta:
fields=['problem','question','option']

视图.py

def edit_chatbot(request,id=None):
problem=Problem.objects.get(pk=id)
question=ChatQuestion.objects.filter(problem_id=id)
option=Option.objects.filter(question_id=id)
if request.method == 'POST':
form = Editchatbot(request.POST)
if form.is_valid():
problem=form.cleaned_data['problem']
question=form.cleaned_data['question']
option=form.cleaned_data['option']
form.save()
messages.success(request,'successfully!')
return redirect('/fleet/chatbot_list')
else:
messages.error(request,'Please correct following',form.errors)
else:
form = Editchatbot(initial={'problem':problem,'question':question,'option':option})
context = {
'menu_management': 'active',
'chatbot': 'active',
'form': form,
'question':question,
'option':option
}
return render(request, "chatbot/edit_chatbot.html", context=context)

输出错误

Traceback (most recent call last):
File "C:UsersHIAppDataLocalProgramsPythonPython37libsite-packagesdjangocorehandlersexception.py", line 34, in inner
response = get_response(request)
File "C:UsersHIAppDataLocalProgramsPythonPython37libsite-packagesdjangocorehandlersbase.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:UsersHIAppDataLocalProgramsPythonPython37libsite-packagesdjangocorehandlersbase.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:20_jan_2022_everesteverest_jarvisfleetviews.py", line 4129, in edit_chatbot
form.save()
AttributeError: 'Editchatbot' object has no attribute 'save'
ERROR "POST /fleet/chatbot/edit/1 HTTP/1.1" 500 79813

回答初始错误

将这三行从使用changed_data更改为使用cleaned_data

changed_data是一个包含有更改的字段名称的列表,它不包含更改本身。cleaned_data存储了验证后的数据。有关更多,请参阅检查哪些表单数据已更改文档

problem=form.cleaned_data['problem']
question=form.cleaned_data['question']
option=form.cleaned_data['option']

回答第二个错误-无保存方法

您的表单应该从forms.ModelForm扩展,而不是从form.Form扩展。前者允许您构建数据库驱动的表单(见文档(,而后者允许您创建与模型无关的表单(参见文档(

你可能也会发现这个参考网站有用的Classy Django Forms它是一个非常有用的参考网站,其工作方式与更常用的Class Baed Views参考网站类似

更新3-基于回复

我承认,比起你在做什么,我更关注你的错误。我现在看到你在一个表单中使用多个模型。所以一种方法是继续使用这些表单。表单,然后自己添加一个保存方法,您可以调用该方法并编写自定义逻辑以保存到每个模型中。另一种选择是使用一个模型表单,通过其meta使用一个模块,将其他字段添加为自定义字段,重载保存方法以保存第一个模块,然后添加自己的逻辑以保存其他模块。

最新更新