2016-04-06 8 views
2

Я относительно новый в django и python, и теперь на пару дней я пытаюсь понять, как отправлять запросы PUT и DELETE через формы django.PUT и DELETE Django

Я нашел это темы: https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/

Sending a DELETE request from a form in Django

Но так это тем решить эту проблему швы не легко для меня. Итак, вопрос в том, есть ли простой способ отправить PUT и DELETE запросы через формы в Django.

Сейчас у меня есть это:

views.py

class AllRoutes(View): 

model = Schedule 
template_name = 'trains_schedule/all_routes.html' 

def get(self,request,train_id=None): 
    if train_id: 
     train = Schedule.objects.get(pk=int(train_id)) 
     context = {'train':train} 
    else: 
     context = {'schedule_list':Schedule.objects.all()} 
    return render(request,'trains_schedule/all_routes.html',context) 

def delete(self,request,train_id=None): 
    route = get_object_or_404(Schedule, pk=train_id) 
    response = u'Successful delete route {}'.format(route.display_name()) 
    route.delete() 
    return HttpResponse(response) 

urls.py

urlpatterns = [ 
url(r'^trains/(?P<train_id>[0-9]+)?$', views.AllRoutes.as_view(), name='trains')] 

all_routes.html

{% if schedule_list %} 
<h3>{{ "List of all train routes" }}</h3> 
<ul> 
{% for train_route in schedule_list %} 
    <li><a href="{% url 'trains' train_route.id %}">{{ train_route.display_name }}</a></li> 
{% endfor %} 
</ul> 
{% else %} 
<p></p> 
{% endif %} 

{% if train %} 
<h1>{{ train.train }}</h1> 

<h3>{{ "Route info" }}</h3> 
{{ train.display_train }} 

<h3>{{ "Train info" }}</h3> 
{{train.display_train_info}} 

<form method="delete"> 
{% csrf_token %} 
<input type="submit" value="Delete" /> 
</form> 
{% else %} 
<p></p> 
{% endif %} 

Сейчас он работает следующим образом:

  • /поезда/показать список всех поездов маршрутов и предоставить ссылки на каждый маршрут
  • /поезда/12 - получаем() в views.py получил маршрут идентификатор и показать информацию об этом маршруте

И я хочу, чтобы при нажатии «delete» - просмотреть запрос DELETE.

Я заканчиваю с делать это таким образом:

<form method="post"> 
{% csrf_token %} 
<input id="action_id" type="hidden" name="action" value="Delete"> 
<input type="submit" value="Delete" /> 
</form> 

и views.py я добавить обработку почтового запроса с action_id == «Удалить»

Но я хочу, чтобы сделать реальные DELETE и PUT запрос, а не разобрать запрос POST, чтобы понять, что мне нужно сделать - удалить или изменить маршрут или добавить новый.

Я понимаю, что мне нужно изменить эту часть:

<form method="delete"> 
{% csrf_token %} 
<input type="submit" value="Delete" /> 
</form> 

Но я не знаю, как это сделать.

+0

Вы спрашиваете, как правильно удалить или редактировать в Django или вы хотите реализовать надлежащий интерфейс для отдыха?Ответ будет иным, как для интерфейса отдыха, лучше всего использовать сторонний пакет – dkarchmer

+0

Я просто хочу знать, что это самый простой способ отправить запрос PUT и DELETE с лицевой стороны. Я читал о рамочной структуре REST - понимаю много, но та же проблема - не понимаю, как отправить запрос PUT и DELETE с внешней стороны. – Vova

+0

Звучит так, будто вы читаете, что используете PUT и DELETE для изменения и удаления данных, но если вы не разрабатываете API, вы можете просто использовать правильный способ Django для создания редактирования и удаления представлений. Так что, скорее, пытаясь использовать слова, которые вы не можете понять, может быть, объясните, какова ваша конечная цель. – dkarchmer

ответ

3

Согласно HTML standard, действующие методы для формы: GET и POST. Таким образом, вы не можете сделать это так: <form method="delete">. Однако Django правильно обрабатывает методы «PUT» и «DELETE» (и все остальные) http.

from django.views.generic import View 


class TestView(View): 
    http_method_names = ['get', 'post', 'put', 'delete'] 

    def put(self, *args, **kwargs): 
     print "Hello, i'm %s!" % self.request.method 

    def delete(self, *args, **kwargs): 
     print "Hello, i'm %s!" % self.request.method 


Hello, i'm PUT! 
[06/Apr/2016 23:44:51] "PUT /de/teacher/test/ HTTP/1.1" 
Hello, i'm DELETE! 
[06/Apr/2016 23:57:15] "DELETE /de/teacher/test/ HTTP/1.1" 

Вы можете сделать PUT и УДАЛИТЬ http-звонки, которые считаются ajax. Если вам нужно использовать его форму вы можете сделать некоторый обходной путь:

<form action="{% url 'teacher:test' %}" method="post"> 
    {% csrf_token %} 
    <input type="hidden" name="_method" value="delete"> 
    <input type="submit" value="Delete"> 
</form> 


class TestView(View): 
    http_method_names = ['get', 'post', 'put', 'delete'] 

    def dispatch(self, *args, **kwargs): 
     method = self.request.POST.get('_method', '').lower() 
     if method == 'put': 
      return self.put(*args, **kwargs) 
     if method == 'delete': 
      return self.delete(*args, **kwargs) 
     return super(TestView, self).dispatch(*args, **kwargs) 

    def put(self, *args, **kwargs): 
     print "Hello, i'm %s!" % self.request.POST.get('_method') 

    def delete(self, *args, **kwargs): 
     print "Hello, i'm %s!" % self.request.POST.get('_method') 


Hello, i'm delete! 
[07/Apr/2016 00:10:53] "POST /de/teacher/test/ HTTP/1.1" 
Hello, i'm put! 
[07/Apr/2016 00:10:31] "POST /de/teacher/test/ HTTP/1.1" 

Это не реальный PUT, но вы можете использовать один и тот же интерфейс для форм и Ajax/API вызовов.

+0

Спасибо, поэтому я понимаю правильно - нет способа отправить запрос PUT и DELETE на чистый HTML-код? – Vova

+0

Точно! http://www.w3schools.com/tags/att_form_method.asp – crash843

+0

Просто комментируя, что именно так я нашел ограничение методов http из определенных представлений. У меня есть представление, где я хочу разрешить кому-то GET, POST или DELETE, но не PUT или PATCH. – whoisearth

Смежные вопросы