提交表单POST请求后Django控制台出现警告与错误,求解决方案
让我们逐个拆解你遇到的问题,给出具体的修复方案:
1. RuntimeWarning:DateTimeField 接收无时区 datetime
这个警告是因为你给commentDate赋值时用了datetime.now(),而你的Django项目已经启用了时区支持(USE_TZ = True在settings里),这个方法返回的是无时区感知的datetime对象,不符合Django的要求。
修复步骤:
- 首先导入Django的时区工具:
from django.utils import timezone
- 然后把
form.instance.commentDate = datetime.now()替换为:
form.instance.commentDate = timezone.now()
这样就能生成带时区感知的datetime对象,警告就会消失。
2. AttributeError & ImproperlyConfigured:缺少重定向URL
这两个错误是关联的:Django的CreateView在表单验证成功后,默认会尝试调用创建对象的get_absolute_url()方法来确定重定向地址,如果你的Comment模型没有定义这个方法,也没有在视图里指定success_url,就会触发这两个错误。
你有两种修复方式,选一种就行:
方式一:在Comment模型中定义get_absolute_url
打开你的Comment模型文件,添加这个方法:
from django.urls import reverse class Comment(models.Model): # 你的其他字段定义... def get_absolute_url(self): # 这里假设你想重定向到评论所属的场景详情页,根据你的实际URL名称调整 return reverse('scenario-detail', kwargs={'pk': self.commentScenario.pk})
reverse里的'scenario-detail'要替换成你项目中场景详情页的URL名称,确保和urls.py里的一致。
方式二:在CommentCreateView中指定success_url
如果你不想修改模型,可以直接在视图类里添加success_url属性,用reverse_lazy来延迟解析URL:
from django.urls import reverse_lazy class CommentCreateView(LoginRequiredMixin, CreateView): model = Comment fields = [ 'commentText' ] # 添加这一行,根据你的实际URL调整 success_url = reverse_lazy('scenario-list') # 或者场景详情页的URL def form_valid(self, form): # 你的原有代码... return super().form_valid(form)
如果需要重定向到当前提交评论的场景详情页(带动态pk),可以重写get_success_url方法:
def get_success_url(self): return reverse('scenario-detail', kwargs={'pk': self.kwargs.get('scenario_id')})
3. ConnectionAbortedError
这个错误大概率是因为你表单里的onsubmit脚本:setTimeout(function(){window.location.reload();},10)。这个脚本会在表单提交后10毫秒就强制刷新页面,此时Django的POST请求可能还没处理完成,导致连接被中断。
修复步骤:
直接去掉表单的onsubmit属性即可,因为CreateView在处理完表单后会自动重定向到指定的URL,不需要手动刷新页面:
<form method="POST" action="{% url 'comment-create' scenario.pk %}"> {% csrf_token %} {{ newComment }} <div class="center"> <button class="btn waves-effect waves-light" type="submit"value="Submit">Publish</button> </div> </form>
如果确实需要在提交后刷新页面,建议通过重定向后的页面逻辑处理,而不是在submit时强制刷新。
把这些修改都做完后,你的表单提交应该就不会再出现这些错误了。
内容的提问来源于stack exchange,提问作者lukos06

