Django如何在views.py中使用HTML标签属性?

时间:2018-11-25 05:39:35

标签: python django

我正在尝试创建一个更改布尔值并从中切换图像的视图,我已经完成了,但是我需要在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)的值。它只是更改数据库中第一个对象的值。

如何更改我单击的对象的值?

1 个答案:

答案 0 :(得分:0)

有多种方法可以实现此目的。这可能是最基本的:

  1. 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 })
    
  2. 将网址更改为以下内容:

    path('asiento/', views.reservacion, name='asientos'),
    path('asiento/change_status/<int:asiento_id>/', views.reservacion, name='reservacion_status')
    
  3. 将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。

  1. 将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 })
    
  2. 您的网址可能正确。应该是这样的:

    path('asiento/change_status/', views.reservacion, name='reservacion_status')
    
  3. 将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>
    

我想这是一个好的开始。可以通过多种方式改进此代码,但这超出了这个问题。