上下移动列表项

时间:2017-07-08 16:03:30

标签: django django-views

我们说我们有一个项目清单。并且,我们希望允许用户通过单击(向下箭头)来降低第一级的顺序来控制他们的订单。并且,同样将订单设置为更高一级。

views.py

def item_up(request, item_id):
    item = get_object_or_404(Item, id=item_id)
    swap_order = item.order - 1
    swap = get_object_or_404(Item, order=swap_order)
    item.order += 1000
    item.save()
    swap.order += 1
    item.order -= 1001
    swap.save()
    item.save()
    return redirect(request.META['HTTP_REFERER'])

def item_down(request, item_id):
    item = get_object_or_404(Item, id=item_id)
    swap_order = item.order + 1
    swap = get_object_or_404(Item, order=swap_order)
    item.order -= 1000
    item.save()
    swap.order -= 1
    item.order += 1001
    swap.save()
    item.save()
    return redirect(request.META['HTTP_REFERER'])

这种方式有效,除非我只有两个项目,它会显示错误。

No Item matches the given query.

任何想法?

2 个答案:

答案 0 :(得分:0)

您可能正在传递数据库中不存在的ID,或者swap_order的逻辑错误。

当对象不存在(或未找到)时,会引发此消息错误。

https://docs.djangoproject.com/en/1.11/_modules/django/shortcuts/#get_object_or_404

答案 1 :(得分:0)

尝试:

def item_up(request, item_id):
    item = Item.objects.get(id=item_id)
    swap_order = item.order - 1
    if Item.objects.filter(order=swap_order).exists:
        swap = Item.objects.get(order=swap_order)
        item.order += 1000
        item.save()
        swap.order += 1
        item.order -= 1001
        swap.save()
        item.save()
    return redirect(request.META['HTTP_REFERER'])

def item_down(request, item_id):
    item = Item.objects.get(id=item_id)
    swap_order = item.order + 1
    if Item.objects.filter(order=swap_order).exists:
       swap = Item.objects.get(order=swap_order)
       item.order -= 1000
       item.save()
       swap.order -= 1
       item.order += 1001
       swap.save()
       item.save()
    return redirect(request.META['HTTP_REFERER'])