正在尝试将基于函数的视图转换为通用局部视图



为ticket-django项目创建注释系统。我已经完成了注释的大部分功能,只是我不太确定如何实现POST方法,以便使用前端创建注释。如果我使用管理网站,它会工作并显示在视图中,但当我尝试使用前端表单提交时,我遇到了一个错误。我不知道如何进行,非常感谢任何帮助。

追溯


Traceback (most recent call last):
File "C:Usersmikhabug_envlibsite-packagesdjangodbbackendsutils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "C:Usersmikhabug_envlibsite-packagesdjangodbbackendssqlite3base.py", line 416, in execute
return Database.Cursor.execute(self, query, params)
The above exception (NOT NULL constraint failed: tickets_comment.ticket_id) was the direct cause of the following exception:
File "C:Usersmikhabug_envlibsite-packagesdjangocorehandlersexception.py", line 47, in inner
response = get_response(request)
File "C:Usersmikhabug_envlibsite-packagesdjangocorehandlersbase.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:Usersmikhabug_envlibsite-packagesdjangoviewsgenericbase.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "C:Usersmikhabug_envlibsite-packagesdjangoviewsgenericbase.py", line 101, in dispatch
return handler(request, *args, **kwargs)
File "C:Usersmikhaissuetrackerticketsviews.py", line 73, in post
user_comment.save()
File "C:Usersmikhabug_envlibsite-packagesmpttmodels.py", line 1096, in save
super().save(*args, **kwargs)
File "C:Usersmikhabug_envlibsite-packagesdjangodbmodelsbase.py", line 743, in save
self.save_base(using=using, force_insert=force_insert,
File "C:Usersmikhabug_envlibsite-packagesdjangodbmodelsbase.py", line 780, in save_base
updated = self._save_table(
File "C:Usersmikhabug_envlibsite-packagesdjangodbmodelsbase.py", line 885, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "C:Usersmikhabug_envlibsite-packagesdjangodbmodelsbase.py", line 923, in _do_insert
return manager._insert(
File "C:Usersmikhabug_envlibsite-packagesdjangodbmodelsmanager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:Usersmikhabug_envlibsite-packagesdjangodbmodelsquery.py", line 1301, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "C:Usersmikhabug_envlibsite-packagesdjangodbmodelssqlcompiler.py", line 1441, in execute_sql
cursor.execute(sql, params)
File "C:Usersmikhabug_envlibsite-packagesdjangodbbackendsutils.py", line 99, in execute
return super().execute(sql, params)
File "C:Usersmikhabug_envlibsite-packagesdjangodbbackendsutils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "C:Usersmikhabug_envlibsite-packagesdjangodbbackendsutils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "C:Usersmikhabug_envlibsite-packagesdjangodbbackendsutils.py", line 80, in _execute
with self.db.wrap_database_errors:
File "C:Usersmikhabug_envlibsite-packagesdjangodbutils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:Usersmikhabug_envlibsite-packagesdjangodbbackendsutils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "C:Usersmikhabug_envlibsite-packagesdjangodbbackendssqlite3base.py", line 416, in execute
return Database.Cursor.execute(self, query, params)

这是最初的基于功能的视图

def ticket_single(request, post):
ticket = get_object_or_404(Ticket, slug=ticket, status='published')
allcomments = ticket.comments.filter(status=True)

user_comment = None
if request.method == 'POST':
comment_form = NewCommentForm(request.POST)
if comment_form.is_valid():
user_comment = comment_form.save(commit=False)
user_comment.ticket = ticket
user_comment.save()
return HttpResponseRedirect('/' + ticket.slug)
else:
comment_form = NewCommentForm()
return render(request, 'ticket_detail.html', {'ticket': ticket, 'comments':  user_comment, 'comments': comments, 'comment_form': comment_form, 'allcomments': allcomments, })

以下是我目前在DetailView 中的内容

class TicketDetailView(DetailView):
model = Ticket

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['comments'] = Comment.objects.filter(ticket=self.object)
context['comment_form'] = NewCommentForm()
return context

def post(self, request, *args, **kwargs):
if request.method == 'POST':
comment_form = NewCommentForm(request.POST)
if comment_form.is_valid():
user_comment = comment_form.save(commit=False)
user_comment.save()
return render(request, 'ticket_detail.html', {'comments': user_comment, 'comment_form': comment_form})

看看这个错误:

(NOT NULL constraint failed: tickets_comment.ticket_id ...)

这意味着,您尝试创建Comment对象(从tickets应用程序(,但没有提供ticketticket_id。您没有在基于类的视图中包含user_comment.ticket = ticket,而且应该包含,因为它是您的模型所必需的。

最新更新