【问题标题】:Django FormView method 'form_valid()' not working when I specify html form action当我指定html表单操作时,Django FormView方法'form_valid()'不起作用
【发布时间】:2021-10-17 00:27:03
【问题描述】:

我正在尝试通过 POST 发送此表单数据。当我点击提交时,它会将我重定向到指定的<form action="{% url 'create-checkout-session' %}",但我从未收到电子邮件。如果我删除<action="",它会通过电子邮件发送数据,但我当然不会被重定向到我想要的网址。问题是这个 url 不是我可以硬编码的,因为它是由 Stripe 支付生成的,并且对于每个请求都是一个新请求,所以 FormView 的 success_url 不是我可以使用的。

我想要实现的是重定向到表单操作,但同时通过电子邮件获取表单数据。

这是表格。

<form action="{% url 'create-checkout-session' %}" method="POST">
    {{form.name}}
    {{form.surname}}
<button type="submit" class="btn btn-success">
    Card Payment
</button>

我在视图中是这样处理的。

class checkoutView(UserPassesTestMixin, FormView):
    template_name = 'store/checkout.html'
    form_class = userInfoForm
    success_url = reverse_lazy('create-checkout-session')

    def form_valid(self, form):
        subject = 'New message from: ' + form.cleaned_data['email']
        message = form.cleaned_data['name']
        recipient_list = settings.EMAIL_HOST_USER
        connection = settings.EMAIL_HOST_USER,
        send_mail(subject, message, recipient_list, connection)
        return super().form_valid(form)

【问题讨论】:

    标签: django forms django-forms formview


    【解决方案1】:

    您在发送电子邮件时犯了一些错误。您将settings.EMAIL_HOST_USER 用作recipient_list,但这应该是收件人列表,而不是您要从中发送项目的电子邮件地址。因此,recipient_list 很可能是一个以self.request.user 为项目的单例列表。这也应该是send_mail第四个 参数,而不是第三个。如果您要发送电子邮件,您也可以使用form.cleaned_data['email'] 代替。

    对于connection,我们可以利用NoneDEFAULT_FROM_EMAIL 设置一起使用,因此我们可以发送电子邮件:

    class checkoutView(UserPassesTestMixin, FormView):
        template_name = 'store/checkout.html'
        form_class = userInfoForm
        success_url = reverse_lazy('create-checkout-session')
    
        def form_valid(self, form):
            subject = 'New message from: ' + form.cleaned_data['email']
            message = form.cleaned_data['name']
            recipient_list = [request.user.email]
            send_mail(subject, message, None, recipient_list)
            return super().form_valid(form)

    【讨论】:

    • 感谢您指出这一点!即使 send_mail() 中有错误,我仍然可以发送电子邮件。这里的问题是当我有一个 HTML 格式的action 时,我没有收到电子邮件。如果我将操作保留为空字符串,我会收到电子邮件。
    • @Spaceguy:通常定义action={% 'name-of-the-view' %} 以确保引用正确的视图。特别是对于可能有用的 POST 请求,因为对错误视图的 POST 请求可能会进行不必要的更改。 GET 应该是“安全的”,而 POST 请求则不是。
    • 我真的做到了! path('create-checkout-session/', createCheckoutSessionView.as_view(), name='create-checkout-session'), 这是网址,这是我在动作中写的 &lt;form action="{% url 'create-checkout-session' %}" method="POST"&gt;
    • @Spaceguy:但是你的视图类被命名为checkoutView,而不是createCheckoutSessionView。因此,您向错误的视图发出 POST 请求。
    • 是的,我现在明白了,谢谢。我仍然需要对该视图的 POST 请求并将我重定向到视图create-checkout-session 猜猜这就是success_url 的用途,但我不能使用success_url 因为正如我所说的那样,url 是由视图create-checkout-session 生成的,它总是不同的。
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2018-12-06
    • 2013-05-20
    • 2021-11-15
    相关资源
    最近更新 更多