Удаление объектов в Джанго - PullRequest
21 голосов
/ 26 июня 2010

В мини-приложении блога я хочу создать функцию удаления, чтобы владелец блога мог удалять свои записи (и только свои записи). Я думаю, что единственный способ сделать это, используя форму. Хотя мой код удаления кажется ясным и правильным, он не работает. Мой код:

def delete_new(request,id):
   u = New.objects.get(pk=id).delete()
   if request.method == 'POST':
       form = DeleteNewForm(request.POST)    
       form.u.delete()             
       form.save()   
   return render_to_response('news/deleteNew.html', {
           'form': form,
           }, 
        context_instance=RequestContext(request)) 

и в шаблоне:

<a href='/news/delete_new/{{object.id}}/'> Delete</a> <br /> 

Это правильный подход? Я имею в виду создание формы для этого? кроме того, единственный способ получить сообщение в блоге, связанное со ссылкой для удаления, - это использовать идентификатор в качестве параметра. Это правильно? Я имею в виду, может быть, любой пользователь может ввести другой идентификатор в URL и удалить другую запись (в конечном счете, не одну из его)

Ответы [ 2 ]

28 голосов
/ 30 ноября 2012

Вам нужно использовать форму, или вы уязвимы для CSRF-атак .Вы также удаляете модель, прежде чем проверите, был ли запрос GET или POST.

Создайте простое ModelForm:

from django import forms

from .models import New

class DeleteNewForm(forms.ModelForm):
    class Meta:
        model = New
        fields = []

В вашем файле views.py вто же самое приложение Django:

from django.shortcuts import render, get_object_or_404

from .forms import DeleteNewForm
from .models import New

def delete_new(request, new_id):
    new_to_delete = get_object_or_404(New, id=new_id)
    #+some code to check if this object belongs to the logged in user

    if request.method == 'POST':
        form = DeleteNewForm(request.POST, instance=new_to_delete)

        if form.is_valid(): # checks CSRF
            new_to_delete.delete()
            return HttpResponseRedirect("/") # wherever to go after deleting

    else:
        form = DeleteNewForm(instance=new_to_delete)

    template_vars = {'form': form}
    return render(request, 'news/deleteNew.html', template_vars)
20 голосов
/ 26 июня 2010

Как правило, для удаления объектов лучше использовать POST (или DELETE) HTTP-методы .

Если вы действительно хотите использовать HTTP GET для своего примера, вот что вам нужно исправить:

Если у вас есть URL, указывающий на какой-то URL, такой как ваш: <a href='/news/delete_new/{{object.id}}/'> Delete</a>, тогда вы можете простоПредставление write, которое проверит, принадлежит ли объект зарегистрированному пользователю, и удалит эту запись, если да, как в коде, который вы уже написали:

def delete_new(request,id):
   #+some code to check if New belongs to logged in user
   u = New.objects.get(pk=id).delete()

Чтобы проверить, передаются ли новые объекты какому-либо пользователю, вам нужно создать реализациюмежду User и New (например, created_by = models.ForeignKey(User) в модели New).

Вы можете войти в систему таким образом: request.user

Я надеюсь, что вы поняли ваше мнениеправильно, и мой ответ вам как-то поможет.

PS: Вы также можете рассмотреть возможность использования тега {% url %} вместо записи URL-адресов непосредственно в ваших шаблонах.

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