放入并删除Django [英] PUT and DELETE Django
问题描述
我在django和python中相对较新,现在几天来,我试图弄清楚如何通过django表单发送PUT和DELETE请求。
I找到了以下主题:
https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/
但是,本主题解决此问题的方式对我来说并不容易。所以问题是-是否有任何简单的方法可以通过Django中的表单发送PUT和DELETE请求。
现在我有了这个:
views.py
class AllRoutes(View):
模型= 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'成功删除路由{}'。format(route.display_name())
route.delete()
return HttpResponse(response)
urls.py
urlpatterns = [
url(r'^ trains /(?P< train_id> [0-9 ] +)?$',views.AllRoutes.as_view(),名称=火车)]
all_routes.html
{%if schedule_list%}
< h3> {{所有火车路线的列表}}< / h3>
< ul>
{schedule_list%中的train_route的百分比}
< li>< a href = {%url'trains'train_route.id%}> {{train_route.display_name}}< / a< / li>
{%endfor%}
< / ul>
{%else%}
< / p>
{%endif%}
{%如果火车%}
< h1> {{train.train}}< / h1>
< h3> {{路线信息}}< / h3>
{{train.display_train}}
< h3> {{火车信息}}< / h3>
{{train.display_train_info}}
< form method = delete>
{%csrf_token%}
<输入类型=提交 value =删除 />
< / form>
{%else%}
< / p>
{%endif%}
现在它是这样工作的:
- / trains /显示所有火车路线的列表,并提供指向每条路线的链接
- / trains / 12-get()在views.py中获得路线ID并显示有关该路线的信息
我希望在我按删除时-查看收到DELETE
我以这种方式结束:
< ; form method = post>
{%csrf_token%}
<输入id = action_id type = hidden name = action value =删除>
< input type = submit value =删除 />
< / form>
,然后在views.py中添加带有action_id == Delete
但是我想发出真正的DELETE和PUT请求,而不是解析POST请求以了解我需要做的事情-删除或更改路由或添加新的请求。
我了解我需要更改此部分:
< form method =删除
{%csrf_token%}
<输入类型=提交 value =删除 />
< / form>
但是我不知道该怎么做。
根据 HTML标准,表单的有效方法是 GET
和 POST
。因此,您无法像这样< form method = delete>
一样。
但是Django正确处理了'PUT'和'DELETE'(以及所有其他)http方法。
来自django。 views.generic import View
class TestView(View):
http_method_names = ['get','post','put','delete']
def put(self,* args,** kwargs):
打印你好,我是%s! %self.request.method
def delete(self,* args,** kwargs):
print你好,我是%s! %self.request.method
你好,我是PUT!
[06 / Apr / 2016 23:44:51] PUT / de / teacher / test / HTTP / 1.1
您好,我要删除!
[06 / Apr / 2016 23:57:15]删除/ de / teacher / test / HTTP / 1.1
您可以通过ajax进行PUT和DELETE http调用。
如果您需要使用它,可以执行一些解决方法:
< form action = {%url 'teacher:test'%} method = post>
{%csrf_token%}
<输入类型=隐藏 name = _ method value =删除>
< input type = submit value =删除>
< / 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你好,我是%s! %self.request.POST.get(‘_ method’)
def delete(self,* args,** kwargs):
print你好,我是%s! %self.request.POST.get(‘_ method’)
您好,我要删除!
[2016年4月7日00:10:53] POST / de / teacher / test / HTTP / 1.1
您好,我放了!
[07 / Apr / 2016 00:10:31] POST / de / teacher / test / HTTP / 1.1
这不是真正的 PUT
,但是您可以对表单和ajax / api调用使用相同的界面。
I relatively new in django and python and now for a couple of days i'm trying to figure how to send PUT and DELETE requests throught django forms.
I found this topics: 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
But the way this topics solve this problem seams not easy for me. So question is - is there are any easy way to send PUT and DELETE requests throught forms in Django.
For now i 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 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 %}
Now it works this way:
- /trains/ show list of all trains routes and provide links to every route
- /trains/12 - get() in views.py got route id and show information about this route
And i want that when i pressing "delete" - view receive DELETE request.
I end with doing it this 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 i add handling of post request with action_id =="Delete"
But i want to make real DELETE and PUT request, not parse the POST request to understand that i need to do - delete or change route or add new one.
I understand that i need to change this part:
<form method="delete">
{% csrf_token %}
<input type="submit" value="Delete" />
</form>
But i dont know how to do it.
According to the HTML standard, the valid methods for form are GET
and POST
. So you can't do like this <form method="delete">
.
However Django correct handle 'PUT' and 'DELETE' (and all 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 and DELETE http calls thought the ajax. If you need to use it form you can do some 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 the real PUT
but you can use the same interface for forms and ajax/api calls.
这篇关于放入并删除Django的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!