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
Post a Comment