【问题标题】:getting 405 method not allowed不允许使用 405 方法
【发布时间】:2019-02-13 05:35:46
【问题描述】:

收到 405 错误,无法说明原因。 Url 似乎检查了 POST 方法....我在这里缺少什么。

urls.py

from django.conf.urls import url, include
from django.contrib import admin
from tweets.views import Index, Profile, PostTweet
admin.autodiscover()


urlpatterns = [
    url(r'^$', Index.as_view()),
    url(r'^user/(\w+)/$', Profile.as_view()),
    url(r'^user/(\w+)/post/$', PostTweet.as_view()),
]

html

{% extends "base.html" %}
{% block content %}

<div class="row clearfix">
  <div class="col-md-12 column">
    <form method = 'POST'>{% csrf_token %}
      <!-- <div class="col-md-8 col-md-offset-2  fieldWrapper"> -->
        {{ form.text.errors }} 
        {{ form.text }}
      <!-- </div> -->
      {{ form.country.as_hidden }}
       <button type="submit"  value="post it">Post
    </form>
  </div>
  <!-- <div class="col-md-12 column">
    {% for tweet in tweets %}
    <div class="well">
    <span>{{ tweet.text }}</span>
    </div>
    {% endfor %}
  </div> -->
</div>
{% endblock %} 

views.py

class PostTweet(View):
    def post(self, request):
        if request.method =='POST':
          print('post')
        return HttpResponse('posted')

无论我做什么,仍然会出现上述错误。 任何想法将不胜感激。 谢谢

【问题讨论】:

  • 您忘记关闭button 标签。

标签: django post


【解决方案1】:

试试这个:

{% extends "base.html" %}
{% block content %}

<div class="row clearfix">
  <div class="col-md-12 column">
    <form method = 'post'>{% csrf_token %}                         #<-- POST to post
      <!-- <div class="col-md-8 col-md-offset-2  fieldWrapper"> -->
        {{ form.text.errors }} 
        {{ form.text }}
      <!-- </div> -->
      {{ form.country.as_hidden }}
       <button type="submit"  value="post it">Post</button>        #add this
    </form>
  </div>
  <!-- <div class="col-md-12 column">
    {% for tweet in tweets %}
    <div class="well">
    <span>{{ tweet.text }}</span>
    </div>
    {% endfor %}
  </div> -->
</div>
{% endblock %} 

【讨论】:

  • 没有区别。 html 可以容忍关闭/不 clong 标签。除了错误是405错误。
  • @AlonBen-Ari 你为什么不使用Generic CBV's
  • @AlonBen-Ari 基于分类的视图!
  • 这与我遇到的 405 错误有什么关系?
【解决方案2】:

您需要在视图中更改您的发布方法名称,它应该是post 而不是Post。还需要更新方法签名,如下所示:

class PostTweet(View):
    def post(self, request, *args, **kwargs):  # renamed it post instead of Post
        if request.method =='POST':
          print(post)
        return HttpResponse('posted')

也像这样更新表单:

<form method="post">{% csrf_token %}
  <!-- <div class="col-md-8 col-md-offset-2  fieldWrapper"> -->
    {{ form.text.errors }} 
    {{ form.text }}
  <!-- </div> -->
  {{ form.country.as_hidden }}
   <button type="submit"  value="post it">Post
</form>

更新

你需要给视图提供一个get方法来获取http get的功能(我用render()来显示html):

class PostTweet(View):
    def post(self, request, *args, **kwargs):  # renamed it post instead of Post
        if request.method =='POST':
          print(post)
        return HttpResponse('posted')

    def get(self, request, *args, **kwargs):
        form = YourForm()
        return render(request, 'your_html.html', {'form': form})

您还需要定义一个form(如果您没有)以在 html 中呈现表单。

最后,我不知道您为什么要如此麻烦地呈现表单,您只需使用FormView 即可为您完成所有工作。例如:

class YourForm(forms.Form):
    country = forms.CharField()


class PostTweet(FormView):
     form_class = YourForm
     template_name = "path/to/template.html"

     def form_valid(self, form):
         print(form.cleaned_data)  # it will show all the data submitted from the form
         return super(YourFormView, self).form_valid(form)

如我所见,您的网址未使用正则表达式正确定义。你可以这样更新它:

urlpatterns = [
    url(r'^user/(?P<username>[-\w]+)/post/$', PostTweet.as_view()),  # or any other variable
    url(r'^user/(?P<username>[-\w]+)/$', Profile.as_view()),
    url(r'^$', Index.as_view()),
]

因此,当您点击查看PostTweet 时,请使用/user/&lt;any_username&gt;/post/,其中any_username 可以是您想要使用的任何用户名。

【讨论】:

  • 听从了您的建议。无济于事。
  • 您能否在您的问题中分享更新后的代码?我不确定这里出了什么问题。顺便说一句,您查看过 FormView 部分吗?
  • @AlonBen-Ari 请将YourFormView 重命名为PostTweet 并将其链接到网址
  • 我在上面添加了代码,开头是“这就是我按照您的建议得到的。”还是一样的错误。不允许使用 405 方法。
  • 好吧,我认为这里有误会,是我的错。我以YourFormView 为例,它应该是PostTweet。我已经更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 2012-06-29
  • 2013-03-13
  • 2016-03-08
  • 2014-09-19
  • 2016-04-20
  • 2019-03-01
相关资源
最近更新 更多