Form
forms.py
from django import forms
class UserForm(forms.Form):
username = forms.CharField(label='用户名', max_length=128)
password = forms.CharField(label='密码', max_length=256, widget=forms.PasswordInput)
views.py
class LoginView(View):
def get(self, request):
# 需要先实例化个我还form表单
login_form = UserForm(request.POST)
return render(request, 'login.html', locals())
def post(self, request):
login_form = UserForm(request.POST)
message = "请检查填写的内容!"
if login_form.is_valid():
username = request.POST.get('username')
password = request.POST.get('password')
try:
user = User.objects.get(name=username)
if user.password == password:
return redirect('index')
else:
message = "密码不正确!"
except:
message = "用户名不存在!"
return render(request, 'login.html', locals())
html页面引用方法
{{ login_form }}
手动渲染表单字段
直接{{ login_form }}
虽然好,啥都不用操心,但是界面真的很丑,往往并不是你想要的,如果你要使用CSS和JS,比如你要引入Bootstarps框架,这些都需要对表单内的input元素进行额外控制,那怎么办呢?手动渲染字段就可以了。
可以通过{ login_form.name_of_field }}
获取每一个字段,然后分别渲染,如下例所示:
<div class="form-group">
{{ login_form.username.label_tag }}
{{ login_form.username}}
</div>
<div class="form-group">
{{ login_form.password.label_tag }}
{{ login_form.password }}
</div>
其中的label标签可以用label_tag
方法来生成。这样子更加灵活了,但是灵活的代价就是我们要写更多的代码,又偏向原生的HTML代码多了一点。
但是问题又...又...又来了!仔细查看最终生成的页面源码,你会发现,input元素里少了一个CSS
的类form-control。这可咋办?
在form类里添加attr属性即可,如下所示:
from django import forms
class UserForm(forms.Form):
username = forms.CharField(label="用户名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control'}))
password = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'}))
ModelForm
整合model模型和forms表单
给出一个简单的例子:
# login/forms.py
from django import forms
from . import models
class UserForm(forms.ModelForm):
class Meta:
model = models.User
fields = ['name', 'password']
def __init__(self, *args, **kwargs):
super(UserForm, self).__init__(*args, *kwargs)
self.fields['name'].label = '用户名'
self.fields['password'].label = '密码'
要注意,用户名字段由‘username’变成了‘name’,这是model决定的。
发表评论