Django2.2.1利用django.forms快速生成表单
django.forms这个Django的内置包
这个包用于快速生成表单,可以根据需要调整表单的内容,样式,以及增加检查机制。(其实就是form的model)
代码
创建forms.py文件
Django习惯于在forms.py文件中去寻找利用django.forms包构建的表单。
所以应当在当前app的路径下创建forms.py文件
forms.py文件内容如下:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=False)
message = forms.CharField(widget=forms.Textarea)
#在django.forms生成的子类中,以“clean_”开头的函数,都默认为检查函数。
def clean_message(self):#这是一个检查函数
message = self.cleaned_data['message']
num_words = len(message.split())
if num_words < 4:
raise forms.ValidationError("Not enough words!")
return message
创建对应的模板
在当前app的“templates/app名称/”路径下创建一个contact_form.html的模板文件(template)
<html>
<head>
<title>Contact us</title>
</head>
<body>
<h1>Contact us</h1>
{% if form.errors %}
<p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below.
</p>
{% endif %}
<form action="" method="post">
<!--{% csrf_token %}-->
<table>
<!--让form以table形式展现-->
{{ form.as_table }}
</table>
<input type="submit" value="Submit">
</form>
</body>
</html>
修改当前app的views.py文件
from polls.forms import ContactForm
def contactnew(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
send_mail(
cd['subject'],
cd['message'],
cd.get('email', 'noreply@example.com'),
['siteowner@example.com'],
)
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm(
initial={'subject': 'I love your site!'}
)
return render_to_response('polls/contact_form.html', {'form': form})
修改当前app的urls.py文件
urlpatterns = [
...
path('contactnew/', views.contactnew, name='contactnew'),
]
问题
如果在浏览http://localhost:8000/polls/contact_new/时出现了
Error403 CSRF verification failed. Request aborted.
这个错误,有一下两种解决办法:
参考链接:参考链接
1.在contact_form.html的所有遇到POST的form中加上
<form action="" method="post">
{% csrf_token %}
2.在Django项目的settings.py文件中把下面这一行注释掉
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]