django - 为什么在发布后 FormView 中没有调用 clean ?

标签 django django-class-based-views

我的观点是:

class SendTransfer(SingleObjectMixin, FormView):
    model = BankAccount
    form_class = SendTransferForm
    template_name = 'dashboard/send_transfer.html'

    def dispatch(self, request, *args, **kwargs):
        self.object = self.get_object()
        return super(SendTransfer, self).dispatch(request, *args, **kwargs)

    def get_object(self, queryset=None):
        obj = super(SendTransfer, self).get_object(queryset)

        if not obj.is_owner(self.request.user.citizen):
            raise Http404

        return obj

    def form_valid(self, form):
        data = form.cleaned_data
        MoneyTransfer.objects.create(sender=self.object,
                                     receiver=data['receiver'],  # ModelChoiceField in the form
                                     total=data['total'],  # FloatField in the form, etc.
                                     when=timezone.localtime(timezone.now()),
                                     comment=data['comment'])
        return redirect('AccountDetail', self.object.pk)

    def form_invalid(self, form):
        return render(self.request, self.template_name, self.get_context_data())

    def get_form_kwargs(self):
        return {'sender': BankAccount.objects.get(id=self.kwargs['pk']), 'user': self.request.user}

提交表单时 - 我得到的结果与获取后的结果相同。调试器说 clean() 未被调用,但 form_invalid 有效。有什么问题吗?

最佳答案

您已覆盖get_form_kwargs,现在不再将数据传递到表单。如果没有data,表单是未绑定(bind)的,因此永远不会有效。

最好先调用 super(),更新 kwargs,然后返回它们。

def get_form_kwargs(self):
    kwargs = super(SendTransfer, self).get_form_kwargs()
    kwargs['sender'] = BankAccount.objects.get(id=self.kwargs['pk']), 
    kwargs['user'] = self.request.user
    return kwargs

关于django - 为什么在发布后 FormView 中没有调用 clean ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34765950/

相关文章:

django - 重置用户 django Rest Auth 的密码

python - Django 表单 : "Select a valid choice. That choice is not one of the available choices."

python - 动态服务 django docker 容器

python - 向文章 django createviewforeignkey 添加评论

Django - 在根目录中放置和访问 js 文件

python - django 按 Enter 并显示 ^M

python - 在 Django DetailView 旁边显示对象列表

python - 如何使用 WeekArchiveView 默认显示最近一周的项目?

python - 支付完成后无法显示成功页面

python - 在 Django 1.8 中创建基于登录和注销类的 View