Подтвердить что ты не робот

Объект удаления django

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

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-адрес и удалить другую запись (в конечном счете, не одну из них)

4b9b3361

Ответ 1

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

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

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

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-адресов непосредственно в своих шаблонах.

Ответ 2

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

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

from django import forms

from .models import New

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

В вашем представлении .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)