有什么方法可以在列表视图中更新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框架很陌生,不知道如何使其工作。
答案 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。
答案 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>