使用 django 后端更新 BD 并通过 ajax 发布表单



鉴于我有我的用户个性化模型。这有 2 个我想通过表单更新的字段,它们在其中输入一个数值,在此过程中,完成了数学运算。好吧,我希望该数学运算的结果根据输入的数值更新登录的用户字段。我正在导入 Jquery 的库。

通过隐藏的 2 个输入,我访问了要通过数学运算更新的 2 个字段,我在我的 javascript 文件中通过 id 调用它

html file
<div><form method="POST" 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 }}">
Recuerde, que usted dispone de {{ user.d_pendientes }} dias y 
{{ user.h_pendientes }} horas a compensar <br>
<button type="submit" onclick="calculo()" class="boton">Guardar</button>

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;
alert(dias_base);
alert(horas_base);
} console.log(calculo);

阿贾克斯脚本----------------------------------------------------

$(document).ready(function(){
var productForm = $(".form-data")
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)
}
})
})
})

我在姜戈--------------------------------------中的观点

def solit(request):
if request.method == 'POST' and request.is_ajax():
form = addiForm(request.POST)
if form.is_valid():
peticion = form.save()
if peticion.usuario:
peticion.usuario.d_pendientes = request.POST.get('d_pendientes', None)  # Get the form value if has, otherwise assign it to None (change it if you want another default value)
peticion.usuario.h_pendientes = request.POST.get('h_pendientes', None)  # The same
peticion.usuario.save()
print (request.POST)
return JsonResponse({'status': 'true', 'msg': 'Procesado Correctamente'})
else:
return JsonResponse({'status': 'false', 'msg': 'Los datos no son validos'})
form = addiForm()
return render(request, 'plantillas/adicionar.html', {'form':form})

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',

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= True)
h_pendientes = models.IntegerField(null= True, blank= True)
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)

目前,在 JavaScript 控制台中,当提交时,以下消息返回我 {状态:"true",msg:"正确处理"} msg:"正确处理" 状态:"真"原型:对象,但值不更新我 示例:我有 5 个苹果可用,好吧,我拿了 2 个,好吧,我应该将 2 个发送到用户数据库,但它没有。我想通过数学运算在用户中更新什么,请帮忙,我做错了什么?问候和感谢。

这里的问题是你假设你的 Peticion 表格将保存 2 个 usuarios 字段。您必须分别保存这 2 个字段,您可以这样做:

def solit(request):
if request.method == 'POST' and request.is_ajax():
form = addiForm(request.POST)
if form.is_valid():
peticion = form.save()
if peticion.usuario:
peticion.usuario.d_pendientes = request.POST.get('d_pendientes', None)  # Get the form value if has, otherwise assign it to None (change it if you want another default value)
peticion.usuario.h_pendientes = request.POST.get('h_pendientes', None)  # The same
peticion.usuario.save()
return JsonResponse({'status': 'true', 'msg': 'Procesado Correctamente'})
else:
return JsonResponse({'status': 'false', 'msg': 'Los datos no son validos'})
form = addiForm()

这应该可以完成工作,请记住,如果您不实现ModelForm,则永远不会保存另一个模型的变量。

最新更新