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')
希望这有帮助!