/add_team/ 处的类型错误'dict'对象不可调用



views.py:

class AddTeamView(View):
template_name = 'add_team.html'
def get (self, request):
form = TeamForm()
context = {'form': form}
return render(request, 'add_team.html', context)
def post(self, request):
form = TeamForm(request.POST)
if form.is_valid():
team = Team()
team.name = form.cleaned_data('name')
team.details = form.cleaned_data('detials')
context = {'form': form, 'team.name':team.name,'team.details':team.details}
return render(request, self.template_name, context)

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

forms.py :

from django import forms

class TeamForm(forms.Form):
name = forms.CharField(label='name of team')
details = forms.CharField(label='details of team')

当我去浏览器时,它出现了这个:

/add_team/'dict' 对象的类型错误不可调用 请求方法: POST 请求网址: http://127.0.0.1:8000/add_team/Django 版本: 2.1.1 异常类型: 类型错误 异常值: 'dict' 对象不可调用 异常位置: C:\Users\Acer\Desktop\teammanager\teams\views.py in post, line 52 Python 可执行文件: C:\Users\Acer\Desktop\teammanager_env\Scripts\python.exe Python 版本: 3.7.0

>form.cleaned_data是一个字典,因此您可以通过下标或使用.get(..)方法(在缺少键的情况下返回None或默认值(来获取元素,因此您应该重写:

team.name = form.cleaned_data('name')
team.details = form.cleaned_data('detials')

自:

team.name = form.cleaned_data['name']
team.details = form.cleaned_data['details']# typo: detials -> details

话虽如此,最好做一个ModelForm

class TeamForm(forms.ModelForm):
name = forms.CharField(label='name of team')
details = forms.CharField(label='details of team')

则视图如下所示:

class AddTeamView(View):
template_name = 'add_team.html'
def get (self, request):
form = TeamForm()
context = {'form': form}
return render(request, 'add_team.html', context)
def post(self, request):
form = TeamForm(request.POST)
if form.is_valid():
team =form.save()
context = {'form': form, 'name':team.name,'details':team.details}
return render(request, self.template_name, context)

您还应该考虑使用CreateView而不是简单的视图,并在post(..)成功完成时重定向,因为在 POST 的情况下呈现可能会导致用户刷新页面时出错(请参阅此维基百科文章了解 POST-REDIRECT-GET 模式(。

在表单中的数据被清理后,需要获取从另一个页面发布的新数据。

重写:

team.name = form.cleaned_data('name')
team.details = form.cleaned_data('detials')

自:

team.name = form.cleaned_data.get('name')
team.details = form.cleaned_data.get('detials')

希望这有帮助!

最新更新