【问题标题】:The "post" method in DjangoDjango 中的“post”方法
【发布时间】:2019-02-24 18:56:36
【问题描述】:

我创建了三个文件:

2-view.py:

class AddTeamView(View):
    def get (self, request):
        form = TeamForm()
        context = {'form': form}
        return render(request, 'add_team.html', context)

1-forms.py:

class TeamForm(forms.Form):
    name = forms.CharField( max_length='100')
    details = forms.CharField(max_length='250')

3-add_team.html:

-这里还有一个名为“base.html”的文件

{% extends 'base.html' %}
{% block title %}
add team
{% endblock %}

{% block content %}

    <form action="/add_team/" method="post">

    {% csrf_token %}
    {{ form }}

     <input type="submit" value="Submit">

    </form>  

{% endblock %}

我去cmd进入服务器“python manage.py runserver”

它出现在浏览器上:

“此页面无法正常工作 如果问题仍然存在,请联系网站所有者。 HTTP 错误 405"

【问题讨论】:

  • 在视图中实现post 方法。
  • 请加满error traceback
  • [不允许的方法:/add_team/ [20/Sep/2018 01:51:00] "POST /add_team/ HTTP/1.1" 405 0 [20/Sep/2018 01:52:56 ]“GET /add_team/ HTTP/1.1”200 2286 方法不允许(POST):/add_team/ 方法不允许:/add_team/ [20/Sep/2018 01:53:02]“POST /add_team/ HTTP/1.1” 405 0 [20/Sep/2018 01:53:04] “GET /add_team/ HTTP/1.1”200 2286
  • 这是合乎逻辑的,因为您没有定义 post(..) 函数。不过,我认为在这里使用CreateView 会更好。
  • 给我您的 models.py 代码并帮助您,或者我可以发布我的答案,然后您将其添加到您的场景中......

标签: django python-3.x


【解决方案1】:

一个视图可以支持GETPOSTPUT等方法,因为对应的方法存在,所以视图应该有一个.get(..).post(..).put(..)等函数。

这里你只实现了一个def get(self, request),所以不允许POST请求。

根据您显示的数据,这看起来像是CreateView [Django-doc] 的典型用例。这些视图的想法是封装常见场景,以便通过覆盖一些属性,创建一个针对特定情况量身定制的视图,例如:

class AddTeamView(CreateView):
    form_class = TeamForm
    template_name = 'add_team.html'
    success_url = '/some/success_url'

TeamForm 可能应该是 ModelForm,或者至少是 Form,您可以在其中覆盖 .save(..) 函数以将数据正确保存到数据库中,因为现在,表单没有做任何事情(好吧,它接收数据,但在验证后,它会丢弃它)。

您可能想要覆盖form_valid(..) 函数,以防您想要重定向到success_url。此外,success_url 从给定的视图名称中延迟解析是很常见的,例如:

class AddTeamView(CreateView):
    form_class = TeamForm
    template_name = 'add_team.html'
    success_url = reverse_lazy('view_name')

【讨论】:

    【解决方案2】:

    所以,我们不需要做一个条件来检查请求是 POST 还是 GET:

    您的views.py:

    from django.views.generic import View
    
    class AddTeamView(View):
        def post(self, request):
            form = TeamForm(request.POST)
            if form.is_valid():
                new_tm = TeamModel(name=form.cleaned_data['name'], details=form.cleaned_data['details'])
                new_tm.save()
                return redirect('team_list')
            return render(request, 'add_team.html', {'form': form})
    
        def get(self, request):
            form = TeamForm()
            return render(request, 'add_team.html', {'form': form})
    

    希望对您有所帮助...

    【讨论】:

    • AttributeError: 'TeamForm' 对象没有属性 'save' [20/Sep/2018 02:51:21] "POST /add_team/ HTTP/1.1" 500 78043
    • 好的!创建 modelForm 因为我认为您的 TeamForm 是模型形式。我用这个修改了我的答案....
    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 2016-03-17
    • 1970-01-01
    • 2019-05-24
    • 2016-02-05
    • 2016-03-13
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多