python - PUT and DELETE Django -


i relatively new in django , python , couple of days i'm trying figure how send put , delete requests throught django forms.

i found topics: https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/

sending delete request form in django

but way topics solve problem seams not easy me. question - there easy way send put , delete requests throught forms in django.

for have this:

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 train routes" }}</h3> <ul> {% 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 %} 

now works way:

  • /trains/ show list of trains routes , provide links every route
  • /trains/12 - get() in views.py got route id , show information route

and want when pressing "delete" - view receive delete request.

i end doing way:

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

and in views.py add handling of post request action_id =="delete"

but want make real delete , put request, not parse post request understand need - delete or change route or add new one.

i understand need change part:

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

but dont know how it.

according html standard, valid methods form get , post. can't <form method="delete">. django correct handle 'put' , 'delete' (and others) http methods.

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" 

you can make put , delete http calls thought ajax. if need use form can workaround:

<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" 

it's not real put can use same interface forms , ajax/api calls.


Comments