簡體   English   中英

Python Django - 通過列表視圖更新 booleanField

[英]Python Django - update booleanField via List View

有什么方法可以更新列表視圖中的 booleanField 嗎? 在列表視圖中,我列出了所有訂單,我需要標記哪些已完成,哪些未完成。 我知道我可以通過 UpdateView 更新它,但這對用戶不友好,因為我必須離開列表視圖頁面。

模型.py

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

視圖.py

class OrderIndex(generic.ListView):

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

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

我的頁面.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 框架很陌生,不知道如何使它工作。

像這樣應該看起來你 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)

這將幫助您如何使用 Django 處理 ajax 請求

通過向 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。

文件

有一種方法可以在沒有任何特殊魔法的情況下執行此操作,只需從您的列表視圖發布到更新視圖,並在隱藏表單字段中正確填寫整個表單,無需在其他任何地方執行任何特殊操作。

<!-- 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM