【问题标题】:How to return Json data in django如何在 django 中返回 Json 数据
【发布时间】:2021-08-18 22:28:51
【问题描述】:

我想从以下代码块中返回 Json 数据,而不是呈现 html 页面,但我不知道如何实现它。我不想使用 rest_framework。当我使用render 时,页面呈现,但当我使用JsonResponse时,它会返回一个错误。

views.py
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.core.mail import send_mail 

def contact_us(request):
    if request.method == "POST":
        name = request.POST.get("name")
        email = request.POST.get("email")
        title = request.POST.get("title")
        message = request.POST.get("message")

        data = {
            "name": name,
            "email": email,
            "title": title,
            "message": message
        }
        message =  '''    
        New message: {}

        From: {}
        '''.format(data["message"], data['email'])
        send_mail(data["title"], message, '', ['mine@gmail.com'])
  
    return JsonResponse(request, 'contact_us/contact_us.html', safe=False)
contact.html

<form action="" method="POST" class="contact_us">
    {% csrf_token %}
    <div>
        <div>Name</div>
        <input type="text" name="name">
    </div>
    <div>
        <div>Email</div>
        <input type="text" name="email">
    </div>
    <div>
        <div>Title</div>
        <input type="text" name="title">
    </div>
    <div>
        <div>Message</div>
        <textarea name="message" cols="30" rows='10'></textarea>
    </div>
    <div>
        <input type="submit", value="submit">
    </div>
</form>

【问题讨论】:

  • 你好@C-Bizz 你应该提供有问题的错误
  • 如果你想传递HTML 的一些代码,你不能在JsonResponse 中传递模板,你可以这样做mytags = &lt;h1&gt;Hello&lt;/h1&gt;,而不是你必须像这样在你的@ 中传递它987654328@return JsonResponse({'mymessage':mytags})
  • 感谢@Ankit Tiwari 的解释。在这种情况下,为了发送电子邮件而填写的表格在模板中。我该如何解决这个问题?我是否应该复制模板中的表单代码并将其粘贴到views.py 以使 JsonResponse 工作?如果是,这是一个好习惯吗?很抱歉问了很多问题,我想知道如何在不使用休息框架的情况下解决这样的情况。我想使用 React 应用程序来获取将返回的 Json 数据。
  • 您想在表单提交后向用户发送电子邮件吗?
  • 您可以在def send_mail(request):get_all_data_from_frontend 的视图中执行类似的操作,然后在向用户发送电子邮件后向用户发送电子邮件,您必须将成功消息返回为JsonResponse

标签: python django email frameworks


【解决方案1】:

如果您使用 React,则必须从前端获取数据,您无需发送模板,您必须在 React 创建包含您的联系表单的联系页面

您必须访问视图中的所有数据

def send_mail(request):
    if request.method == "POST":
            name = request.POST.get("name")
            email = request.POST.get("email")
            title = request.POST.get("title")
            message = request.POST.get("message")
    
            data = {
                "name": name,
                "email": email,
                "title": title,
                "message": message
            }
           current_site = get_current_site(request)
           mail_subject = 'My Subject.'
           message = get_template('contact_us/contact_us.html').render(data)
           to_email = request.POST.get('email')
           email = EmailMessage(
            mail_subject, message, to=[to_email]
            )
           email.content_subtype = "html"
           email.send()
     return JsonResponse({"Success":'Check your email.'})

你必须从django.template.loader import get_templatefrom django.core.mail import EmailMessage导入这两件事

**注意:** 使用try: except:,如果您想排除例外情况,使用email.send(fail_silently=False) 避免电子邮件错误,例如发送邮件失败 等等

查看官方文档。更多信息https://docs.djangoproject.com/en/3.2/topics/email/#emailmessage-objects

【讨论】:

  • 非常感谢@Ankit Tiwari。当我使用 post 请求在 Postman 上测试代码时,出现错误:current_site = get_current_site(request) NameError: name 'get_current_site' is not defined
  • 您好@C-Bizz,您不需要在电子邮件中添加您当前的站点我提供给您的代码用于我的激活帐户逻辑我通过我的当前域和令牌和用户 ID 但在你的情况你不需要这个,所以你可以删除它
  • 如果您仍想将它用于任何目的,您可以将其导入 from django.contrib.sites.shortcuts import get_current_site,它会起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-23
  • 2020-09-05
  • 2014-11-22
  • 1970-01-01
  • 2019-05-01
  • 2015-08-13
  • 1970-01-01
相关资源
最近更新 更多