Я пытаюсь удалить строку с помощью массива. Можете ли вы сказать мне грамматику orm? - PullRequest
1 голос
/ 02 июня 2019

Я пытаюсь удалить строку, используя массив. Можете ли вы сказать мне грамматику orm?

def todo_delete_ajax(request):

    todo_ids = request.POST.getlist('todo_arr[]')
    # result : todo_ids :  ['76', 97]

    if todo_ids:
        print("todo_ids : ", todo_ids)
        return redirect('/todo/')
    else:
        print("todo_ids : ", todo_ids)

    return redirect('/todo/')

Я хочу использовать Django orm и удалить 76,97 модели todo

Спасибо, если дадите мне знать, как.

1 Ответ

1 голос
/ 02 июня 2019

Вы можете использовать:

Todo.objects.filter(<b>pk__in=todo_ids</b>)<b>.delete()</b>

Но вышесказанное не очень безопасно:

  1. вы не проверяете, что запрос AJAX выполняется вошедшим в систему пользователем; и
  2. что пользователь имеет доступ к этим Todo объектам, например, если он / она является владельцем.

Таким образом, это означает, что хакер может «внедрить» первичные ключи других пользователей в свои Todo объекты.

В случае, если модель Todo имеет поле owner, вы можете предотвратить это с помощью:

<b>@login_required</b>
def todo_delete_ajax(request):
    todo_ids = request.POST.getlist('todo_arr[]')
    if todo_ids:
        Todo.objects.filter(pk__in=todo_ids<b>, owner=request.user</b>).delete()
    return redirect('/todo/')

Возможно, вы также хотите использовать имя представления в вызове redirect, поэтому:

@login_required
def todo_delete_ajax(request):
    todo_ids = request.POST.getlist('todo_arr[]')
    if todo_ids:
        Todo.objects.filter(pk__in=todo_ids, owner=request.user).delete()
    return redirect(<b>'name-of-todo-view'</b>)

, поскольку при использовании жестко закодированного URL-адреса, если вы измените путь к этому URL-адресу или запустите сервер по определенному пути, URL-адрес станет недействительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...