Получение проблемы при редактировании записи в Django Form
Все у меня возникает проблема при редактировании записи на основе идентификатора проблемы, только запись о проблеме отображается автоматически, чат-вопрос и запись о варианте не отображаются автоматически, возможно, мой ORM ошибается. Даже когда я сохраняю запись получаю ошибку, пожалуйста, помогите мне. Это грубая операция, я сделал список и добавить запись, но это тоже сложно, если кто-то может сделать просто, это будет более полезно для меня. Спасибо.
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')
forms.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']
views.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.changed_data['problem']
question=form.changed_data['question']
option=form.changed_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:\Users\HI\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\HI\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\HI\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\20_jan_2022_everest\everest_jarvis\fleet\views.py", line 4126, in edit_chatbot
problem=form.changed_data['problem']
TypeError: list indices must be integers or slices, not str
ERROR "POST /fleet/chatbot/edit/1 HTTP/1.1" 500 79771
ERROR Internal Server Error: /fleet/chatbot/edit/1
Traceback (most recent call last):
File "C:\Users\HI\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\HI\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\HI\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\20_jan_2022_everest\everest_jarvis\fleet\views.py", line 4126, in edit_chatbot
problem=form.changed_data['problem']
TypeError: list indices must be integers or slices, not str
ERROR "POST /fleet/chatbot/edit/1 HTTP/1.1" 500 79771
Измените эти три строки, используя changed_data
на cleaned_data
.
changed_data
- это список, содержащий имена полей, в которых произошли изменения, он не содержит самих изменений. cleaned_data
сохраняет данные после валидации. Подробнее см. в документации Проверка того, какие данные формы изменились
problem=form.cleaned_data['problem']
question=form.cleaned_data['question']
option=form.cleaned_data['option']