django实现用户登入

####前端
```html
{% extends 'layout/basic.html' %}
{% load static %}
{% block title %} 用户登录 {% endblock %}

{% block css %}
    <link rel="stylesheet" href="{% static 'css/account.css' %}">
{% endblock %}

{% block content %}
    <div class="account">
        <div class="title">用户登录</div>
        <form method="POST" novalidate>
            {% csrf_token %}
            {% for field in form %}
                {% if field.name == 'code' %}
                    <div class="form-group">
                        <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                        <div class="row">
                            <div class="col-xs-7">
                                {{ field }}
                                <span class="error-msg">{{ field.errors.0 }}</span>
                            </div>
                            <div class="col-xs-5">
                                <img src="{% url 'image_code' %}" id="imageCode" title="点击更换图片">
                            </div>
                        </div>
                    </div>
                {% else %}
                    <div class="form-group">
                        <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                        {{ field }}
                        <span class="error-msg">{{ field.errors.0 }}</span>
                    </div>
                {% endif %}
            {% endfor %}
            <div>
                <div style="float: right;">
                    <a href="{% url 'login_sms' %}">短信验证码登录?</a>
                </div>
            </div>
            <div class="row">
                <div class="col-xs-3">
                    <input type="submit" class="btn btn-primary" value="登  录"/>
                </div>
            </div>
        </form>
    </div>
{% endblock %}

{% block js %}
    <script>
        $(function () {
            $('#imageCode').click(function () {
                var oldSrc = $(this).attr('src');
                $(this).attr('src', oldSrc + "?");
            })
        })
    </script>
{% endblock %}
```
####在view中处理登入函数
```python
def login(request):
    """用户账号登入"""
    if request.method == 'GET':
        form = LoginForm(request)
        return render(request, 'login.html', {'form': form})
    form = LoginForm(request,data = request.POST)
    if form.is_valid():
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user_object = models.UserInfo.objects.filter(Q(mobile_phone=username)|Q(email=username)).
            filter(password=password).first()
        if user_object:
            request.session['user_id'] = user_object.id
            request.session.set_expiry(60*60*24*12)
            return redirect('index')
        form.add_error('username','用户名或者密码错误')
  return render(request, 'login.html', {'form': form})
```
####在Form中进行的处理
先创建一个类,把一些from类的公共要创建的东西写入进去,然后让其他的类继承它就可以节约很多代码了
```python
class bootstrap(object):
    bootstrap_class_exclude = []
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        for name,filed in self.fields.items():
            if name in self.bootstrap_class_exclude:
                continue
            filed.widget.attrs['class'] = 'form-control'  # 添加属性
            filed.widget.attrs['placeholder'] = '请输入%s'%(filed.label,)
```
####创建对form进行用户账户登入操作
```python
class LoginForm(bootstrap,forms.Form):
    username = forms.CharField(label='邮箱或手机号')
    password = forms.CharField(label='密码',widget=forms.PasswordInput())
    code = forms.CharField(label='图片'
                                 '验证码')
    def __init__(self, request, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.request = request
    def clean_password(self):
        pwd = self.cleaned_data['password']
        return encrypt.md5(pwd)  # 密码加密并且返回
    def clean_code(self):
        """判断验证码是否输入正确"""
        code = self.cleaned_data['code']
        # 去session中去获取验证码
        session_code = self.request.session.get('image_code')
        if not session_code:
            raise ValidationError('验证码已经过去')
        if code.strip().upper() != session_code.strip().upper():
            raise ValidationError('验证码输入错误')
        return code
```
原文地址:https://www.cnblogs.com/KingOfCattle/p/13673135.html