【问题标题】:How to solve method not allowed (Post) http error 405如何解决方法不允许(发布)http错误405
【发布时间】:2019-09-29 05:49:54
【问题描述】:

视图中的代码

我是 django 的新手,我无法纠正出错的地方,谁能帮我解决这个问题。

class UpdateVote(LoginRequiredMixin,UpdateView):
    form_class = VoteForm
    queryset = Vote.objects.all()

    def get_object(self,queryset=None):
        vote = super().get_object(queryset)
        user = self.request.user
        if vote.user != user:
            raise PermissionDenied('can not change another user vote')
        return vote
    def get_success_url(self):
        movie_id = self.object.movie.id
        return reverse('core:movie_detail', kwargs={'pk':movie_id})
    def render_to_response(self, context, **response_kwargs):
        movie_id = context['object'].id
        movie_detail_url = reverse('core:movie_detail',kwargs={'pk':movie_id})
        return redirect(to=movie_detail_url)

class MovieDetail(DetailView):
    queryset = Movie.objects.all_with_prefetch_persons()
    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        if self.request.user.is_authenticated:
            vote = Vote.objects.get_vote_or_unsaved_blank_vote(movie=self.object,user=self.request.user)
            if vote.id:
                vote_url_form = reverse('core:UpdateVote',kwargs={'movie_id':vote.movie.id,'pk':vote.id})
            else:
                vote_url_form = (reverse('core:create_vote',kwargs={'movie_id':self.object.id}))
            vote_form = VoteForm(instance=vote)
            ctx['vote_form'] = vote_form
            ctx['vote_url_form'] = vote_url_form
        return ctx

form.py 中的代码

我已使用此表单与 UpdateView 链接

from django import forms
from django.contrib.auth import get_user_model
from .models import Movie,Vote
class VoteForm(forms.ModelForm):
    user = forms.ModelChoiceField(widget=forms.HiddenInput,queryset=get_user_model().objects.all(),disabled=True)
    movie = forms.ModelChoiceField(widget=forms.HiddenInput,queryset = Movie.objects.all(),disabled=True)
    value = forms.ChoiceField(widget=forms.RadioSelect,choices=Vote.VALUE_CHOICE)
    class Meta:
        model = Vote
        fields = ('value','user','movie',)

urls.py

​​>

这是视图的 url 映射。

from django.contrib import admin
from django.urls import path
from .views import MovieList,MovieDetail,PersonDetail,CreateVote,UpdateVote
app_name = 'core'
urlpatterns = [
    path('movies/', MovieList.as_view(), name='movie_list'),
    path('movie/<int:pk>/', MovieDetail.as_view(), name='movie_details'),
    path('person/<int:pk>/', PersonDetail.as_view(), name='person_details'),
    path('movie/<int:movie_id>/vote/', CreateVote.as_view(), name='create_vote'),
    path('movie/<int:movie_id>/vote/<int:pk>', UpdateVote.as_view(), name='UpdateVote'),
]

HTML 模板

这是我使用的模板。

{% block sidebar %}
    <div>
    {% if vote_form %}
        <form action="{{vote_form_url}}" method="post" enctype="multipart/form-data">
            {% csrf_token %}
            {{ vote_form.as_p }}
            <button class="btn btn-primary" type="submit" >Vote</button>
        </form>
    {%  else %}
        <p>Login to vote for this movie</p>
    {% endif %} </div> {% endblock %}

【问题讨论】:

  • 请提供您的回溯
  • 我得到空白页,其中包含此信息“此页面无法正常工作如果问题仍然存在,请联系网站所有者。HTTP 错误 405”除此之外,我没有得到任何回溯。
  • @ToanQuocHo 这是我在终端中遇到的错误。不允许的方法 (POST): /movie/1/ [29/Sep/2019 07:26:48] "POST /movie/1/ HTTP/1.1" 405 0 完整的追溯没有显示在任何地方
  • 您是否在模板代码中使用了类似action="{% url 'code:UpdateVote' movie.id vote.id %}" 的东西?
  • 不,我正在使用这样的形式:'vote_url_form = reverse('core:UpdateVote',kwargs={'movie_id':vote.movi​​e.id,'pk':vote.id} )' 这个 vote_url_form 已经在模板中使用了

标签: django django-forms django-views


【解决方案1】:

问题是因为您的表单被发送到另一个不允许 POST 请求的路径。 vote_form_url 不是您在视图上下文中添加的,请改用 vote_url_form

...
<form action="{{ vote_url_form }}" method="post" enctype="multipart/form-data">
...

顺便说一句,您的MovieDetail 视图可以通过使用LoginRequiredMixinUpdateVote 视图一样摆脱if self.request.user.is_authenticated:

希望有帮助!

【讨论】:

  • 我已经按照你说的修改了代码,但仍然抛出同样的错误:(
  • 尝试打开浏览器,检查代码并确保 url 如下所示:movie/4/vote/5,数字表示对象 ID。
  • 网址没有改变它仍然看起来像电影/1/
  • 请稍等,我正在向问题中添加表单和 MovieDetail。
  • 继续添加表单和ModelDetail视图的视图。也许其他人也可以帮忙..我要离开这里一个小时,回来后看看
猜你喜欢
  • 2015-08-25
  • 2019-07-29
  • 2011-06-21
  • 2014-03-21
  • 2014-12-12
  • 2021-06-18
  • 2017-10-16
  • 2020-02-13
  • 2016-08-24
相关资源
最近更新 更多