PUT and DELETE Django



我在django和python方面相对较新,现在几天来我一直在尝试如何通过django表单发送PUT和DELETE请求。

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

从Django 中的表单发送DELETE请求

但这些主题解决这个问题的方法对我来说并不容易。所以问题是,有没有任何简单的方法可以通过Django中的t表单发送PUT和DELETE请求。

现在我有这个:

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 %}

现在它是这样工作的:

  • /列车/显示所有列车路线的列表,并提供每条路线的链接
  • /trains/12-get()在views.py中获取路线id并显示有关该路线的信息

我想当我按下"删除"-查看接收删除请求。

我最后这样做:

<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"对发布请求的处理

但我想发出真正的DELETE和PUT请求,而不是解析POST请求来理解我需要做的事情——删除或更改路由或添加新路由。

我知道我需要更改这个部分:

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

但是我不知道怎么做。

根据HTML标准,表单的有效方法是GETPOST。所以你不能这样做<form method="delete">。但是Django正确地处理了"PUT"one_answers"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"

您可以使用ajax进行PUT和DELETE http调用。如果你需要使用它的形式,你可以做一些变通办法:

<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调用。

最新更新