【问题标题】:How to receive and save data via ajax in django?如何在 django 中通过 ajax 接收和保存数据?
【发布时间】:2019-07-24 21:03:16
【问题描述】:

通过 ajax 我正确发送数据,因为我通过wireshak 看到的数据是正确的。在django服务器上,他向我发送了正确的请求“POST / solit / HTTP / 1.1”200 52。但是发送的值没有收到,它没有到达Mysql数据库,我不明白为什么,如果流量发送数据很好。

在wireshak中我看到了post请求的数据,它们是正确的,但它们没有保存在数据库中,当我希望它们被添加时,就好像我要更新这些数据库字段的记录一样没有,我不明白为什么

这是我的观点.py

def solit(request):
if request.method == 'POST' and request.is_ajax():
    form = addiForm(request.POST)
    if form.is_valid():
        peticion = form.save(commit=False)
        peticion.usuario = request.user
        peticion.save()
        peticion.usuario.d_pendientes = form.cleaned_data.POST.get('d_pendientes')
        peticion.usuario.h_pendientes = form.cleaned_data.POST.get('h_pendientes')
        peticion.usuario.save()   
    return JsonResponse({'status': 'true', 'msg': 'Procesado Correctamente'})

form = addiForm()
return render(request, 'plantillas/adicionar.html', {'form':form})

这是我的models.py------------------

class Usuarios(AbstractUser):

    numero_empleado = models.IntegerField(null= True, blank= True)
    area = models.CharField(max_length = 200, null= True, blank= True)
    d_pendientes = models.IntegerField(null= True, blank= False)
    h_pendientes = models.IntegerField(null= True, blank= False)
    f_init = models.DateField(max_length = 200,null= True, blank= True)
    init_vac = models.DateField(max_length = 200, null= True, blank= True)
    fin_vac = models.DateField(max_length = 200, null= True, blank= True)
    ul_vac_tomadas = models.IntegerField(null= True, blank= True)


class Peticion(models.Model):
    solit_choices = (
    ('Adicionar','Adicionar'),
)
    solicitudes_id = models.AutoField(primary_key=True)
    usuario = models.ForeignKey(Usuarios, on_delete=models.CASCADE, null=True, blank=True)
    petit = models.CharField(max_length = 255, choices=solit_choices, null=True, blank=False)
    fec = models.DateTimeField(auto_now=True)
    razon = models.TextField(max_length=255, null=True, blank=True)
    periodo_init = models.DateField(max_length = 200, null=True, blank=True)
    periodo_fin = models.DateField(max_length = 200, null=True, blank=True)
    dias_adicion = models.IntegerField(null=True, blank=False)
    horas_adicion = models.FloatField(null=True, blank=False)

这是我的forms.py

class addiForm(forms.ModelForm):
class Meta:
    """Formulario de solicitud"""

    model = Peticion

    fields = [

        'solicitudes_id',
        'petit',
        'razon',
        'periodo_init',
        'periodo_fin',
        'dias_adicion',
        'horas_adicion',

    ]

    labels = {

        'solicitud_id':'Solicitud',
        'petit':'Tipo de Petición',
        'razon':'Razon',
        'periodo_init':'Rango de fecha inicial',
        'periodo_fin':'Fecha final',
        'dias_adicion':'Dias a adicionar, si es mas de 8 horas',
        'horas_adicion':'Horas a adiciona, si es menos de 1 dia',

html文件

{% extends "plantillas/base.html" %}
{% block content %}
{% load staticfiles %}
{% now "Y-m-d H:i:s" %} <br>
{{ user.Peti}}
{{ user.numero_empleado}}
<script src="{% static 'js/int.js'%}"></script>
<script
  src="https://code.jquery.com/jquery-3.4.1.js"
  integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
  crossorigin="anonymous"></script>

<div><form method="POST" id="demo" class="form-data" action="{% url 'solit' %}">
   {% csrf_token %}
    <h6>Tipo de peticion:{{form.petit}}</h6>
    <h6>Razon:{{form.razon}}</h6>
    <h6>{{form.solicitudes_id}}</h6>
    <h6>Fecha inicio:{{form.periodo_init}}</h6>
    <h6>Fecha fin:{{form.periodo_fin}}</h6>
    <h6>Introduzca dias a tomar<input id="dias" type="number" name="dias_adicion"></h6>
    <h6>Introduzca horas a tomar<input id="horas" type="number" name="horas_adicion"></h6>
    <input type="hidden" id="const_dias" name="d_pendientes" value="{{ user.d_pendientes }}">
    <input type="hidden" id="const_horas" name="h_pendientes" value="{{ user.h_pendientes }}">

    <button type="submit" onclick="calculo()">Guardar</button>
</div></form></span>
<h6>Recuerde, que usted dispone de {{ user.d_pendientes }} dias y {{ user.h_pendientes }} horas</h6>

js文件---------------------

function calculo()

{

    var dias = parseInt(document.getElementById('dias').value);
    var horas = parseFloat(document.getElementById('horas').value);
    var dias_base  = parseInt(document.getElementById('const_dias').value);
    var horas_base  = parseFloat(document.getElementById('const_horas').value);

    dias_base -= dias;
    horas_base -= horas;

    document.getElementById('const_dias').value = dias_base;
    document.getElementById('const_horas').value = horas_base;



} console.log(calculo);

server django 控制台 [24/Jul/2019 15:30:47] "POST /solit/ HTTP/1.1" 200 52 和 js 控制台消息:"Procesado Correctamente" 状态:“真”

ajax 脚本--------------------------------------------------------

$(document).ready(function(calculo){
var productForm = $("#demo")

productForm.submit(function(event){
  event.preventDefault();

  var thisForm = $(this)
  var actionEndpoint = thisForm.attr("action");
  var httpMethod = thisForm.attr("method");
  var formData = thisForm.serialize();

  $.ajax({
    url: actionEndpoint,
    method: httpMethod,
    data: formData,
    success: function(data){
      console.log("success")
      console.log(data)
    },
    error: function(erroData){
      console.log("error")
      console.log(erroData)
    }
  })

 })
})

【问题讨论】:

  • 你怎么知道它没有存入数据库?
  • 请添加 JavaScript 代码
  • @DanielRoseman 因为我有一个包含用户数据的主 html 页面,它没有准确更新标记为 {{user.d_dependents}} 和 {{user.h_dependents}} 的字段
  • @DiegoAvila js 文件添加谢谢
  • 但这根本不符合。您没有在表单中为 usario 传递任何数据,因此 if peticion.usuario 条件将始终为 false,并且这些字段永远不会更新。

标签: html django django-forms


【解决方案1】:

您还没有真正解释您希望“usario”的价值来自哪里。我将假设您希望它成为当前登录的用户。在这种情况下,您可以这样做:

form = addiForm(request.POST)
if form.is_valid():
    peticion = form.save(commit=False)
    peticion.usuario = request.user
    peticion.save()
    peticion.usuario.d_pendientes = form.cleaned_data.get('d_pendientes')
    peticion.usuario.h_pendientes = form.cleaned_data.get('h_pendientes')
    peticion.usuario.save()   
    return JsonResponse({'status': 'true', 'msg': 'Procesado Correctamente'})

(注意,.get 是一个方法,它需要括号而不是方括号。并且 None 是默认值,您不需要显式指定它。)

编辑

我发现很难理解你在问什么,但我认为你的问题是你根本没有任何名为 dias_adicionarhoras_adicionar 的形式;根据您的实际字段名称,它们被称为 d_pendientesh_pendientes

【讨论】:

  • 在数据库中查询“usario”值,已经定义的值是您数据的一部分,只有它被查询。我添加了您的更正,但我仍然没有更新用户字段并使用我目前在 views.py 中的内容编辑您的答案
  • 我不知道你所说的“咨询”是什么意思。
  • 一个用户登录应用在自定义用户模型的一个字段中已经有3个苹果,但是通过一个表单又拥有另一个模型并且是一个模型表单,添加了2个苹果,怎么办我加了那两个苹果?我要明白吗?感谢一切
  • 我已经更新了上面的代码;但我拒绝了您添加if 声明的编辑。我没有输入if 是有原因的;它永远不会是真的。请从您的代码中删除它,并按照我显示的结构。
  • 对不起,不应该有那些 POST 属性,再次更新。
【解决方案2】:

在您的 JavaScript 代码中没有任何东西会发出 AJAX 请求 - 它只是一个普通形式的 POST 请求。这意味着request.is_ajax() 将为假,并且不会执行表单保存代码。

【讨论】:

  • 嗨@GavinH ajax 脚本已添加到我的问题中。
  • 这个问题仍然没有足够的信息来说明你看到了什么。是否有任何内容记录到浏览器控制台?页面是否刷新?是否有任何 Python print 语句被记录到控制台?
  • 好的,抱歉,在 javascript 控制台中,这对我来说是:{status: "true", msg: "Procesado Correctamente"} 返回 post 请求的 json,告诉我发送数据成功,我在wireshak的请求帖子中看到了数据。在 Django 控制台中,它向我显示以下内容:“POST / solit / HTTP / 1.1” 200 52 代码 200 在接收到 post 请求时是一个 Ok。它不会重新加载页面,因为我通过 ajax 异步发送它,但是登录的用户值没有更新,我看到应该放在“h_pendientes”和“d_dependientes”字段中的数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多