Python Django-通过列表视图更新booleanField

时间:2019-07-25 15:03:31

标签: python django

有什么方法可以在列表视图中更新booleanField吗?在列表视图中,我已列出所有订单,我需要标记哪些已完成和哪些未完成。我知道我可以通过UpdateView更新它,但这对用户不友好,因为我必须离开列表视图页面。

models.py

class Order(models.Model):
    ...
    order = models.CharField(max_length = 255)
    completed = models.BooleanField(blank=True, default=False)

views.py

class OrderIndex(generic.ListView):

   template_name = "mypage.html"
   context_object_name = "orders"

   def get_queryset(self):
      return Order.objects.all().order_by("-id")

mypage.html

{% extends "base.html" %}
{% block content %}
{% for order in orders%}
   User: {{ order.user}} | Completed: {{order.completed}} <input 
   type="checkbox">
{% endfor %}
<input type="submit">
{% endblock %}

我对django框架很陌生,不知道如何使其工作。

3 个答案:

答案 0 :(得分:1)

像这样的JavaScript应该看起来像

const updateField = (order_id) =>{
    var form = new FormData();

    form.append('order_id', order_id);

    fetch('{% url "url_updateField" %}', {
      method:'post',
      body:form,
      mode:'cors',
      cache:'default',
      credentials:'include',
    }).then((response)=>{
      console.log('field update as well')
   })
})

只需在envent onclick上向按钮添加功能

{% extends "base.html" %}
{% block content %}
{% for order in orders%}
   User: {{ order.user}} | Completed: {{order.completed}} <input 
   type="checkbox" onclick="updateField({{order.pk}})">
{% endfor %}
<input type="submit">
{% endblock %}

然后在您看来,您应该具有下面的视图来处理请求

def updateField(request):
    print(request.body.get('order_id'))
    #you should update you model field here 
    return JsonResponse({'ok':True}, status=200)

This will help you How to work with ajax request with django

答案 1 :(得分:0)

通过将整个对象列表的额外上下文添加到UpdateView,将UpdateView与listView功能的一部分结合在一起:

class OrderUpdateView(generic.UpdateView):
    model = Order
    form_class = OrderForm

    ....

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['orders'] = Order.objects.all().order_by("-id") 
        return context

考虑一个简单的模板,其中整个列表都显示在顶部,而底部则具有允许用户更新列表中特定项目的形式。 这种方法有目的地避免使用Ajax和javascript。

documentation

答案 2 :(得分:0)

有一种方法无需任何特殊技巧,只需从列表视图发布到更新视图,即可将整个表单正确填写在隐藏表单字段中,而在其他任何地方都不需要做特殊操作。

<!-- todo_list.html -->
<form method="POST" action="update/{{object.id}}/">
    {% csrf_token %}
    <input type="hidden" name="completed" value="true" />
    <input type="hidden" name="name" value="{{object.name}}" />
    <input type="hidden" name="due_date" value="{{object.due_date|date:'Y-m-d'}}" />
    <input type="hidden" name="details" value="{{object.details}}" />
    <button type="submit" class="btn btn-primary">Not Done</button>
</form>