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()