Django中forms的三种形式写法

一、原生的form
In your models.py
1 class Account(models.Model):
2     username=models.CharField('username',max_length=20);
3     password=models.CharField('password',max_length=50);
4     email=models.EmailField('email');
5 
6     class Meta:
7         verbose_name='Account'
8         verbose_name_plural=verbose_name

In your templates(register.html)
 1                 <form action="" method="POST" class="" role="form">             
 2                    <div class="input-group">
 3                         <span class="input-group-addon" ><img src="{% static 'img/newuser.png' %}" alt="" width='24px'></span>
 4                         <input type="text" class="form-control" placeholder="your name" autofocus="" required="" name='username'>
 5                     </div>               
 6                     <div class="input-group">
 7                         <span class="input-group-addon"><img src="{% static 'img/email.png' %}" alt=""></span>
 8                         <input type="email" class="form-control" placeholder="your email" required="" name='email'>
 9                     </div>
10 
11                     <div class="input-group">
12                         <span class="input-group-addon"><img src="{% static 'img/password_set.png' %}" alt=""></span>
13                         <input type="password" class="form-control" placeholder="your password" required="" name='password_set'>
14                     </div>
15 
16                     <div class="input-group">
17                         <span class="input-group-addon"><img src="{% static 'img/password_confirm.png' %}" alt=""></span>
18                         <input type="password" class="form-control" placeholder="confirm your password" required="" name='password_confirm'>
19                     </div>
20 
21                     <input type="submit" name='register' value="Register" class="btn  btn-success btn-block">
22                 
23                     {% csrf_token %}
24                 </form>


In your views.py
 1 def register(request):
 2     context={}
 3     if request.method=='GET':
 4         return render(request,'register.html',context)
 5     else:
 6         username=request.POST.get('username')
 7         password_set=request.POST.get('password_set')
 8         password_confirm=request.POST.get('password_confirm')
 9         email=request.POST.get('email')
#这里可以有更多的验证设置,或者前端验证后传过来
10 if password_set==password_confirm: 11 Account.objects.create( 12 username=username, 13 password=password_set, 14 email=email, 15 ) 16 return HttpResponse("Register Success") 17 else: 18 return HttpResponse("Your password is not match")



 1 def login(request):
 2     context={}
 3     if request.method=='GET':
 4         return render(request,'login.html',context)
 5     else:
 6         username=request.POST.get('username')
 7         password=request.POST.get('password')
      #验证用户
8 user = Account.objects.filter(username__exact=username,password__exact=password) 9 if user is not None : 10 response=redirect(to='contact')
#设置cookie,后面再讲cooki设置的其他实现方式,这里用手动
11 response.set_cookie("username",username,max_age=3600) 12 return response 13 else: 14 return HttpResponse("Login failed,please go back to try it again")

[需要额外添加验证步骤]

二、使用Django form

In your forms.py,

1 from django import forms
2 
3 class Loginfm(forms.Form):
4     # UI显示名称
5     username=forms.CharField(label='用户')
6     password=forms.CharField(label='密码')

In your views.py

 1 from blogapp.forms import Loginfm
 2 def login(request):
 3     context={}
 4     if request.method=='GET':
 5         loginfm=Loginfm()
 6         context["loginfm"]=loginfm
 7         
 8     else:
 9         loginfm=Loginfm(request.POST)
10         if loginfm.is_valid():
11             username=loginfm.cleaned_data['username']
12             password=loginfm.cleaned_data['password']
user = Account.objects.filter(username__exact=username,password__exact=password)
13 if user is not None: 14 response=redirect(to='contact')
response.set_cookie("username",username,max_age=3600)
return response
else:
return render(request,'login.html',context)

In your templates,

1  <form action="" method="POST" class="" role="form">
2           {{ loginfm.as_p }} 
3           {% csrf_token %}
4 </form>

[Django根据字段属性可以对字段合法性进行检查,比较适合大量的补充信息提交,可以省去很多验证环节]

--自带样式较为有限,当然你也可以额外补充样式--

三、ModelForm

In your forms.py

1 from blogapp.models import User
2 class Loginfm(forms.ModelForm):
3     # 绑定User类
4     class Meta():
5         model=User
6         # 除了'ID'外全部显示,include('ID')只包含'ID',相反
7         exclude=("id",'email')

In your views

 1 def login(request):
 2     context={}
 3     if request.method=='GET':
 4         loginfm=Loginfm()
 5         context["loginfm"]=loginfm
 6     else:
 7         loginfm=Loginfm(request.POST)
 8         if loginfm.is_valid():
 9            # loginfm.save()
10             return HttpResponse("Form submit success")
11     return render(request,'login.html',context)

codes in your templates are the same as above(way2)

原文地址:https://www.cnblogs.com/reaptem/p/7286314.html