Django-как удалить объект с помощью представления

у меня класс людей

class People (models.Model):
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)
    email = models.EmailField(blank = True)
    grade = models.CharField(max_length = 2)

    def __unicode__(self):
        return '%s %s' % (self.first_name, self.last_name)

у меня есть вид удаления

def delete(request):
    query = People.objects.get(pk=id)
    query.delete()
    return HttpResponse("Deleted!")

и у меня есть код шаблона html

{% for person in people_list %}
<TR ALIGN="CENTER">
        <td>{{ person.first_name }}</td>
    <td>{{ person.last_name }}</td>
    <td>{{ person.email }}</td>
    <td>{{ person.grade }}</td>
    <td><form action="/modify.html">
        <input type="submit" value="Modify">
        </form></td>
    <td><form action="/delete.html">
        <input type="submit" value="Delete">
        </form></td>
</TR>
      {% endfor %}

как я могу получить человека.id из шаблона и поместите его в представление удалить и удалите объект, соответствующий человеку.я хочу удостоверение.

3 ответов


вы должны иметь свой delete функция (кстати, назовите это что-то еще, например delete_person) возьмите аргумент, pk.

def delete_person(request, pk):
    ...
    ...

затем в вашем urlconf сделайте что-то вроде этого

url(r'^delete_person/(?P<pk>\d+)/$', 'delete_person', name='delete_person')

а затем сгенерируйте url-адрес в шаблоне так

{% url 'delete-person' person.id %}

PS - нет необходимости, чтобы ваши URL-адреса заканчивались на .html

PPS-было бы хорошей идеей сделать некоторую проверку в представлении, чтобы убедиться, что пользователь уполномочен удалить человека.


Я думаю, вы могли бы использовать ссылку вместо форме:

замените эту строку

<td>
  <form action="/delete.html">
    <input type="submit" value="Delete">
  </form>
</td>

С

<td><a href="/delete/{{ person.id }}">Delete</a></td>

In urls.py вы должны добавить следующую строку, чтобы связать свое представление с url:

url(r'^delete/(?P<person_pk>.*)$', 'person.views.delete' name='delete-person'),

затем измените свой вид:

def delete(request, person_pk):
    query = People.objects.get(pk=person_pk)
    query.delete()
    return HttpResponse("Deleted!")

чтобы развернуть @scriptmonster, я завернул запрос в попытку, кроме как правильно вернуть 404

# urls.py
path("foo/<int:pk>/", views.ModelView.as_view(), name="foo-detail"),$                                     

и

# views.py
from django.http import HttpResponse, HttpResponseNotFound                                               

class ModelView(View):                                                                                             
    model = Foo                                                                                                                                                                                                                                                     

    def delete(self, request, *args, **kwargs):                                                                       
        foo_id = kwargs["pk"]                                                                                      
        try:                                                                                                          
            query = Foo.objects.get(pk=foo_id)                                                                  
            query.delete()                                                                                            
            return HttpResponse("Deleted!")                                                                           
        except:                                                                                                       
            return HttpResponseNotFound()