一个小时前一切都很好,但是现在当我尝试将数据添加到表单并保存时正在运行exception
部分
在调用post方法之前,该表单用于保存和重定向
但是我无法弄清楚为什么异常部分正在运行。
我什么都没改变
在控制台中,它给出了"POST /forum/topics/9/reply HTTP/1.1" 200 523
class NewPostView(generic.CreateView):
form_class = NewPostForm
template_name = 'forum/new_post.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if 'pk' not in context:
context['pk'] = self.kwargs['pk']
return context
def post(self, request, *args, **kwargs):
topic = get_object_or_404(Topic, pk=self.kwargs['pk'])
form = self.get_form()
try:
if form.is_valid():
post = form.save(commit=False)
post.topic = topic
post.created_by = User.objects.get(pk=request.user.pk)
post.save()
return redirect('topic-detail', pk=topic.pk)
except Exception as e:
messages.warning(request, "Failed To Create. Error: {}".format(e))
messages.warning(request, "Failed To Create Check Errors")
args = {'form': form, 'pk': self.kwargs['pk']}
#print(args)
return render(request, self.template_name, args)
编辑:现在我可以看到User matching query does not exist.
错误
Edit2:谢谢大家的答复。我发现了自己的错误,实际上是在使用自己的django.contrib.auth.user
模型时在登录名中使用User
。
当我在模型中更改created_by = models.ForeignKey("auth.User"),
时,它可以正常工作。
答案 0 :(得分:0)
我的猜测是您不再登录该应用程序,因此request.user.pk
是None
。
确保只有登录用户才能访问您的视图的最简单方法是添加LoginRequiredMixin
:
from django.contrib.auth.mixins import LoginRequiredMixin
class NewPostView(LoginRequiredMixin, generic.CreateView):
答案 1 :(得分:0)
我已经改变了您的观点。py
class NewPostView(View):
.....add your template_name, form_class and get function....
def post(self, request, *args, **kwargs):
topic = get_object_or_404(Topic, pk=self.kwargs['pk']) # here you can directly add pk=pk and def post(self, request, pk)
form = self.form_class(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.topic = topic
post.created_by = self.request.user
post.save()
return redirect('topic-detail', pk=topic.pk)
else:
messages.error(request, "Error Message")
return render(request, self.template_name, {'form':form})
对于未登录的用户,您可以按照Daniel的回答和/或在您的模板中添加
{% if user.is_authenticated %}
html
{% else %}
html
{% endif %}