【问题标题】:How to show a message dynamically in a django app?如何在 django 应用程序中动态显示消息?
【发布时间】:2020-02-01 00:19:19
【问题描述】:

我使用 django 创建了一个 web 应用程序,在其中一个部分中我要求用户提供反馈,并在单击提交按钮时向用户发送一封电子邮件,感谢他的反馈。

但是每次我点击提交时,页面都会自动刷新,电子邮件会成功发送但是我想要的是当用户点击提交时,我想在此处显示“谢谢”消息来代替反馈形式。和反馈表被删除

这是我index.html的一部分

<form action="" method="POST">    
    {% csrf_token %}
    <div>{{ form.message }}</div>
    <div>{{ form.email }}</div>
    <p class="formerrors" >{{ form.email.errors.as_text }}</p>
    <hr>
    <input id="submitbutton" type="submit" name="submit" value="Submit">
</form>

这是我的看法 def 索引(请求):

if request.method == 'POST':
    form = FeedbackForm(request.POST)
    if form.is_valid():
        subject = "You got a message"
        message = form.cleaned_data['message']
        email = form.cleaned_data['email']
        actual_message = "You got a message from {} \n\n {} \n\nGo to work\nWith regards".format(email,message)
        recipients = ['example@mail.com']
        sender = 'example@mail.com'
        send_mail(subject, actual_message, sender ,recipients,fail_silently=False)

        return HttpResponseRedirect('')
else:
    form = FeedbackForm()
return render(request,'my_webapp/index.html',{'form':form})

我可以通过编写一个 JS onClick 函数来做到这一点,但有没有更好的方法来做到这一点?此外,内置的 django 消息刷新了我猜的页面,并且始终位于页面顶部。 我当然不希望我的页面被刷新并且希望消息出现在表单的位置。

【问题讨论】:

  • 如果您不想刷新页面,则需要使用 Ajax,如果成功,您可以将表单替换为感谢信息。

标签: django django-forms django-templates django-views


【解决方案1】:

您可以将带有 Ajax 的表单发送到您的 django 视图,并用成功回调的感谢信替换您的表单。

【讨论】:

  • 嘿,对于喂勺的事情,我很抱歉。但是你能不能写一点代码,因为我没有太多使用 AJAX。这对你很有帮助。以及如何在视图中使用 AJAX 传递我的表单。我在forms.py 中定义了我的表单,并且只能从那里获取表单。
【解决方案2】:

您应该使用AJAX 发送您的表单。对于响应部分,您可以在成功验证后从服务器发送消息,并在 AJAXcomplete 函数中将表单的 display 属性更改为 none 以将其删除。然后使用javascript为您的响应消息创建一个元素。

【讨论】:

    【解决方案3】:

    实际上,您不必使用 AJAX 来实现这一点。当用户提交表单时,您可以使用django messages framework 创建消息。

    像这样:

    from django.contrib import messages
    
    ...
    if request.method == 'POST':
        form = FeedbackForm(request.POST)
        if form.is_valid():
            ...
            messages.success("Thank you")
    
            # After submitted, redirect user to current page, the form will be reset
            return HttpResponseRedirect(request.path_info)
    else:
        form = FeedbackForm()
    return render(request,'my_webapp/index.html',{'form':form})
    

    然后在您的模板上:

    {% if messages %}
        {% for message in messages %}
            <p class="text-danger">{{ message }}</p>
        {% endfor %}
    {% endif %}
    
    <form action="" method="POST">    
        {% csrf_token %}
        <div>{{ form.message }}</div>
        <div>{{ form.email }}</div>
        <p class="formerrors" >{{ form.email.errors.as_text }}</p>
        <hr>
        <input id="submitbutton" type="submit" name="submit" value="Submit">
    </form>
    

    如果你想要一个 toastr 消息?,参考this answer

    【讨论】:

    • 感谢您的回复,但正如我所说我不想刷新我的页面我只想在提交表单后显示感谢消息代替表单,这里 django 消息将刷新页面.那么有什么办法可以做到这一点,如果你能帮助我,我对 AJAX 了解不多?
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2020-04-11
    相关资源
    最近更新 更多