放入并删除Django [英] PUT and DELETE Django

查看:99
本文介绍了放入并删除Django的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在django和python中相对较新,现在几天来,我试图弄清楚如何通过django表单发送PUT和DELETE请求。



I找到了以下主题:
https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/



从Django中的表单



但是,本主题解决此问题的方式对我来说并不容易。所以问题是-是否有任何简单的方法可以通过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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆