【发布时间】:2019-12-22 02:26:05
【问题描述】:
总的来说,我仍然是 mixins 的菜鸟,所以我只是想了解这段使用 Ajax 提交表单的代码中发生了什么。我一整天都在搜索文档,试图弄清楚发生了什么。该代码似乎有效,但我只是不完全理解为什么。整个过程我还有很多问号所以如果有人能纠正我的想法那就太棒了
-
AjaxableResponseMixin 扩展了 FormView 的 form_invalid() 和 form_valid() 方法以支持 Ajax 请求
- 为什么 Ajax 类用 super() 引用自己?
- 类如何知道扩展 FormView 的方法?
-
如果请求不是 Ajax 则返回响应
- 响应对象有什么作用/有什么?它是否显示模板?它有模板的上下文吗?
-
CreatePostView是传入的两个父类(AjaxableResponseMixin、FormView)的子类
- 在调用 super() 时,参数中类的顺序是否会产生影响?
- 当 CreatePostView 调用 form_valid() 和 form_invalid() 时是否覆盖了 Ajax 类?如果不是,它改变了哪些类方法?
-
如果表单有效,则创建帖子并调用 super().form_valid(),然后重定向到成功 url,因为 FormView.form_valid() 就是这样做的
- 同样,为什么 super() 指的是 FormView?
- 我最好只做一个 HttpResponseRedirect 而不是使用 super().form_valid()
-
如果表单无效,它会重定向到带有“create_post”名称的 url
- 如何重定向到创建帖子页面并将数据保留在用户尝试提交的表单中?
views.py
class AjaxableResponseMixin(object):
"""
Mixin to add AJAX support to a form.
Must be used with an object-based FormView (e.g. CreateView)
"""
def form_invalid(self, form):
response = super(AjaxableResponseMixin, self).form_invalid(form)
if self.request.is_ajax():
return JsonResponse(form.errors, status=400)
else:
return response
def form_valid(self, form):
response = super(AjaxableResponseMixin, self).form_valid(form)
if self.request.is_ajax():
data = {
'pk': self.object.pk,
}
return JsonResponse(data)
else:
return response
class CreatePostView(AjaxableResponseMixin, FormView):
form_class = CreatePostForm
template_name = 'forum/create_post.html'
success_url = reverse_lazy('home')
def form_valid(self, form):
user = self.request.user
form.create_post(user_obj=user)
messages.success(self.request, 'Your post was published')
return super().form_valid(form)
def form_invalid(self, form):
messages.error(self.request, 'Your post could not be published. Please try again')
return HttpResponseRedirect(reverse('create_post'))
非常感谢任何回答的人。
【问题讨论】:
-
这在python中被称为多重继承,基本上你的问题是this的重复
标签: django ajax django-forms mixins django-class-based-views