一、原生的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)