我正在尝试创建一个更改布尔值并从中切换图像的视图,我已经完成了,但是我需要在12个值(asiento)之间进行迭代,并且我只能指向其中一个,这是我的Django代码
models.py:
class Asientos(models.Model):
asiento = models.CharField(max_length=2,primary_key=True)
status = models.BooleanField()
mesa = models.ForeignKey(Reserva)
def __str__(self):
template = 'Asiento {0.asiento} de la mesa {0.mesa}'
return template.format(self)
views.py:
def reservacion(request):
asientos = Asientos.objects.all()
if request.method == "POST":
estatus = Asientos.objects.get(asiento=asientos)
if estatus.status == True:
estatus.status = False
else:
estatus.status = True
estatus.save()
return render(request,"first_app/reservacion.html", {'asientos': asientos})
HTML:
<form enctype="multipart/form-data" action="{% url 'first_app:reservacion' %}" method="post">
{% csrf_token %}
<div class="row">
{% for asiento in asientos %}
{% if asiento.status %}
<div class="col" ><input class="d-block w-100" value="" name="reservacion" type="image" src="{%static "/img/s6.jpg" %}" >{{asiento.asiento}}</div>
{% else %}
<div class="col" ><input class="d-block w-100" value="" name="reservacion" type="image" src="{%static "/img/sn6.jpg" %}" >{{asiento.asiento}}</div>
{% endif %}
{% if asiento.asiento == '6' %}
</div>
<div class="row">
<div class="col"> </div>
<div class="col"> <img src="{%static "/img/m1.jpg" %}" alt=""> </div>
<div class="col"> </div>
</div>
<div class="row">
{% endif %}
{% endfor %}
</div>
<input type="submit" name="" value="Reservar">
</form>
即使我单击另一个代码,此代码也仅更改第一个Asientos.objects.get(asiento = asientos)的值。它只是更改数据库中第一个对象的值。
如何更改我单击的对象的值?
答案 0 :(得分:0)
有多种方法可以实现此目的。这可能是最基本的:
将reservacion()
更改为:
def reservacion(request, asiento_id=None):
if asiento_id:
estatus = Asientos.objects.get(pk=asiento_id)
if estatus.status == True:
estatus.status = False
else:
estatus.status = True
estatus.save()
asientos = Asientos.objects.all()
return render(request,"first_app/reservacion.html", {'asientos ': asientos })
将网址更改为以下内容:
path('asiento/', views.reservacion, name='asientos'),
path('asiento/change_status/<int:asiento_id>/', views.reservacion, name='reservacion_status')
将html更改为:
<div class="row">
{% for asiento in asientos %}
{% if asiento.status == True %}
<div class="col">
<a href="{% url 'reservaction_status' asiento.pk %}" class="d-block w-100">{% static '/img/s6.jpg' %}</a>
</div>
{% else %}
<div class="col">
<a href="{% url 'reservaction_status' asiento.pk %}" class="d-block w-100">{% static '/img/sn6.jpg' %}</a>
</div>
{% endif %}
{% endfor %}
</div>
如果您想使用POST方法,那么一种相当基本的方法是使用Javascript / jQuery。
将reservacation()更改为:
def reservacion(request):
asientos = Asientos.objects.all()
if request.method == 'POST':
asiento_id = request.POST.get('asiento', None)
if asiento_id:
estatus = Asientos.objects.get(pk=asiento_id)
if estatus.status == True:
estatus.status = False
else:
estatus.status = True
estatus.save()
return JsonResponse({'status': 'Success', 'msg': 'Status changed'})
return render(request,"first_app/reservacion.html", {'asientos ': asientos })
您的网址可能正确。应该是这样的:
path('asiento/change_status/', views.reservacion, name='reservacion_status')
将html更改为:
<div class="row">
{% for asiento in asientos %}
{% if asiento.status == True%}
<div class="col"><input class="d-block w-100" type="image" src="{% static '/img/s6.jpg' %}" name="asiento" value="{{ asiento.pk }}"></div>
{% else %}
<div class="col"><input class="d-block w-100" type="image" src="{% static '/img/sn6.jpg' %}" name="asiento" value="{{ asiento.pk }}"></div>
{% endif %}
{% endfor %}
</div>
<script>
$(document).ready(function() {
$("[name=asiento]").on("click", function() {
var formData = {"csrfmiddlewaretoken": "{{ csrf_token }}", "asiento": $(this).val()}
$.ajax({
url: "{% url 'reservaction_status' %}",
method: "POST",
data: formData,
success: function(msg) {
if (msg.status == "Success") {
location.reload();
} else {
alert("Error changing status");
}
}
})
}
});
</script>
我想这是一个好的开始。可以通过多种方式改进此代码,但这超出了这个问题。