【问题标题】:PUT and DELETE Django放置和删除 Django
【发布时间】:2016-07-27 02:17:52
【问题描述】:

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

我发现了这个主题: 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

但是这个主题解决这个问题的方式对我来说并不容易。所以问题是 - 是否有任何简单的方法可以通过 Django 中的表单发送 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/ 显示所有火车路线的列表并提供每条路线的链接
  • /trains/12 - views.py 中的 get() 获取路线 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" 的post 请求的处理

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

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

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

但我不知道该怎么做。

【问题讨论】:

  • 您是在问如何在 Django 中正确地进行删除或编辑,还是想实现一个正确的休息接口?至于一个rest接口,答案会有所不同,最好是使用第三方包
  • 我只想知道这是从前端发送 PUT 和 DELETE 请求的最简单方法。我阅读了有关 REST 框架的信息 - 了解很多但同样的问题 - 不了解如何从前端发送 PUT 和 DELETE 请求。
  • 听起来你真的读到了你使用 PUT 和 DELETE 来更改和删除数据,但除非你正在开发 API,否则你可以使用正确的 Django 方式来创建编辑和删除视图。因此,与其尝试使用您可能不理解的词语,不如解释一下您的最终目标是什么
  • 好的,我会解释一下 - 我在实习开发人员职位的面试中,我的任务之一是 - 制作 django 服务,结果 - smosker.pythonanywhere.com/schedule 我应该以 REST 方式创建应用程序,但是在前端我应该使用纯 HTML - 但我不知道如何发送 PUT 和 DELETE 请求,并且只对 PUT 和 DELETE 请求发出具有隐藏值的 POST 表单请求。但我的面试官告诉我应该换一种方式。
  • 纯 HTML?不允许使用 Javascript?

标签: python django


【解决方案1】:

根据HTML standard,form的有效方法是GETPOST。所以你不能这样做&lt;form method="delete"&gt;。 但是 Django 正确处理了“PUT”和“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 调用使用相同的接口。

【讨论】:

  • 谢谢,所以我理解正确 - 没有办法在纯 HTML 上发送 PUT 和 DELETE 请求?
  • 只是评论说这是我发现限制特定视图的http方法的方式。我有一个视图,我希望允许某人 GET、POST 或 DELETE,但不允许 PUT 或 PATCH。
猜你喜欢
  • 2011-10-10
  • 2018-07-10
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
相关资源
最近更新 更多