zoukankan      html  css  js  c++  java
  • 如何用Django建立一个后台CRM系统05

    User Register and Login

    用户的注册页面和登录页面

    A-基本页面  

        -在usls。py中创建register和login的url

        -在viesw中写入registerPage函数

          -引入数据库USER中的Form-UserCreationForm

    from django.contrib.auth.forms import UserCreationForm
    
    def registerPage(request):
        form = UserCreationForm()
    
        if request.method=='POST':
            form = UserCreationForm(request.POST)
            if form.is_valid():
                form.save()
    
        context = {'form': form}
        return render(request,'accounts/register.html',context)

        -在template模板中写入register。html

          -{{form_as.p}}  使其按顺序排列

        -在forms.py中自定义model 引入User  选择属性

    from django.forms import  ModelForm
    from .models import Order
    from django.contrib.auth.forms import UserCreationForm
    from django.contrib.auth.models import User
    
    class OrderForm(ModelForm):
        class Meta:
            model = Order
            fields = '__all__'
    
    class CreatUserForm(UserCreationForm):
        class Meta:
            model = User
            fields = ['username','email','password1','password2']

        -更改有关views中的引入函数

    from .forms import OrderForm,CreatUserForm
       
         form = CreatUserForm()
            form = CreatUserForm(request.POST)

        -在r127.0.0.1/register 添加数据  从127.0.0.1/admin/User中查找

    B 渲染模板

        -在register。html中修改页面的渲染方式  单个单个渲染方便后面套用JS

    <h3>Register</h3>
    <form method="POST" action="">
        {% csrf_token %}
        {{ form.username.label }}
        {{ form.username }}
        
        {{ form.email.label }}
        {{ form.email }}
    
        {{ for.password1.label }}
        {{ form.password1 }}
    
        {{ form.password2.label }}
        {{ form.password2 }}
        <input type="submit" name="Create User">
    </form>

       

       -访问 jsfiddle 找到js 渲染模板

          -注册表格模板: https://jsfiddle.net/ivanov11/hzf0jxLg/

    <!DOCTYPE html>
    <html>
    
    <head>
        <title>Login</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" integrity="sha384-gfdkjb5BdAXd+lj+gudLWI+BXq4IuLW5IT+brZEZsLFm++aCMlF1V92rMkPaX4PP" crossorigin="anonymous">
    
        <style>
            body,
            html {
                margin: 0;
                padding: 0;
                height: 100%;
                background: #7abecc !important;
            }
            .user_card {
                width: 350px;
                margin-top: auto;
                margin-bottom: auto;
                background: #74cfbf;
                position: relative;
                display: flex;
                justify-content: center;
                flex-direction: column;
                padding: 10px;
                box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
                -webkit-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
                -moz-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
                border-radius: 5px;
    
            }
    
            .form_container {
                margin-top: 20px;
            }
    
            #form-title{
                color: #fff;
            }
            .login_btn {
                width: 100%;
                background: #33ccff !important;
                color: white !important;
            }
            .login_btn:focus {
                box-shadow: none !important;
                outline: 0px !important;
            }
            .login_container {
                padding: 0 2rem;
            }
            .input-group-text {
                background: #f7ba5b !important;
                color: white !important;
                border: 0 !important;
                border-radius: 0.25rem 0 0 0.25rem !important;
            }
            .input_user,
            .input_pass:focus {
                box-shadow: none !important;
                outline: 0px !important;
            }
    
        </style>
    
    </head>
    <body>
        <div class="container h-100">
            <div class="d-flex justify-content-center h-100">
                <div class="user_card">
                    <div class="d-flex justify-content-center">
                        <h3 id="form-title">REGISTER ACCOUNT</h3>
                    </div>
                    <div class="d-flex justify-content-center form_container">
    
                        <form method="POST" action="">
                            {% csrf_token %}
                            <div class="input-group mb-3">
                                <div class="input-group-append">
                                    <span class="input-group-text"><i class="fas fa-user"></i></span>
                                </div>
                                {{form.username}}
                            </div>
                            <div class="input-group mb-2">
                                <div class="input-group-append">
                                    <span class="input-group-text"><i class="fas fa-envelope-square"></i></span>
                                </div>
                                {{form.email}}
                            </div>
                            <div class="input-group mb-2">
                                <div class="input-group-append">
                                    <span class="input-group-text"><i class="fas fa-key"></i></span>
                                </div>
                                {{form.password1}}
                            </div>
                            <div class="input-group mb-2">
                                <div class="input-group-append">
                                    <span class="input-group-text"><i class="fas fa-key"></i></span>
                                </div>
                                {{form.password2}}
                            </div>
    
    
    
                               <div class="d-flex justify-content-center mt-3 login_container">
                                 <input class="btn login_btn" type="submit" value="Register Account">
                               </div>
    
                        </form>
                    </div>
    
                    {{form.errors}}
    
                    <div class="mt-4">
                        <div class="d-flex justify-content-center links">
                            Already have an account? <a href="{% url 'login' %}" class="ml-2">Login</a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <script>
                            /* Because i didnt set placeholder values in forms.py they will be set here using vanilla Javascript
            //We start indexing at one because CSRF_token is considered and input field
             */
    
            //Query All input fields
            var form_fields = document.getElementsByTagName('input')
            form_fields[1].placeholder='Username..';
            form_fields[2].placeholder='Email..';
            form_fields[3].placeholder='Enter password...';
            form_fields[4].placeholder='Re-enter Password...';
    
    
            for (var field in form_fields){
                form_fields[field].className += ' form-control'
            }
        </script>
    </body>
    </html>
    
    {#<h3>Register</h3>#}
    {#<form method="POST" action="">#}
    {#    {% csrf_token %}#}
    {#    {{ form.username.label }}#}
    {#    {{ form.username }}#}
    {##}
    {#    {{ form.email.label }}#}
    {#    {{ form.email }}#}
    {##}
    {#    {{ for.password1.label }}#}
    {#    {{ form.password1 }}#}
    {##}
    {#    {{ form.password2.label }}#}
    {#    {{ form.password2 }}#}
    {#    <input type="submit" name="Create User">#}
    {#</form>#}

          -登录表单模板: https://jsfiddle.net/ivanov11/dghm5cu7/

    <!DOCTYPE html>
    <html>
        
    <head>
        <title>Login</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" integrity="sha384-gfdkjb5BdAXd+lj+gudLWI+BXq4IuLW5IT+brZEZsLFm++aCMlF1V92rMkPaX4PP" crossorigin="anonymous">
    
    
        <style>
            body,
            html {
                margin: 0;
                padding: 0;
                height: 100%;
                background: #7abecc !important;
            }
            .user_card {
                width: 350px;
                margin-top: auto;
                margin-bottom: auto;
                background: #74cfbf;
                position: relative;
                display: flex;
                justify-content: center;
                flex-direction: column;
                padding: 10px;
                box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
                -webkit-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
                -moz-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
                border-radius: 5px;
    
            }
    
            .form_container {
                margin-top: 20px;
            }
    
            #form-title{
                color: #fff;
                
            }
    
            .login_btn {
                width: 100%;
                background: #33ccff !important;
                color: white !important;
            }
            .login_btn:focus {
                box-shadow: none !important;
                outline: 0px !important;
            }
            .login_container {
                padding: 0 2rem;
            }
            .input-group-text {
                background: #f7ba5b !important;
                color: white !important;
                border: 0 !important;
                border-radius: 0.25rem 0 0 0.25rem !important;
            }
            .input_user,
            .input_pass:focus {
                box-shadow: none !important;
                outline: 0px !important;
            }
    
            #messages{
                background-color: grey;
                color: #fff;
                padding: 10px;
                margin-top: 10px;
            }
        </style>
    
    </head>
    <body>
        <div class="container h-100">
            <div class="d-flex justify-content-center h-100">
                <div class="user_card">
                    <div class="d-flex justify-content-center">
    
    
                        <h3 id="form-title">LOGIN</h3>
                    </div>
                    <div class="d-flex justify-content-center form_container">
                        <form method="POST" action="">
                            {% csrf_token %}
                            <div class="input-group mb-3">
                                <div class="input-group-append">
                                    <span class="input-group-text"><i class="fas fa-user"></i></span>
                                </div>
    
                                <input type="text" name="username" placeholder="Username..." class="form-control">
                            </div>
    
                            <div class="input-group mb-2">
                                <div class="input-group-append">
                                    <span class="input-group-text"><i class="fas fa-key"></i></span>
                                </div>
    
                                    <input type="password" name="password" placeholder="Password..." class="form-control" >
                            </div>
    
                                <div class="d-flex justify-content-center mt-3 login_container">
                                     <input class="btn login_btn" type="submit" value="Login">
                                   </div>
                        </form>
    
                    </div>
    
                    {% for message in messages %}
                        <p id="messages">{{message}}</p>
                    {% endfor %}            
            
                    <div class="mt-4">
                        <div class="d-flex justify-content-center links">
                            Don't have an account? <a href="{% url 'register' %}" class="ml-2">Sign Up</a>
                        </div>
                
                    </div>
                </div>
            </div>
        </div>
    </body>
    
    </html>

          

      C 关于登录错误信息提示Flash

        -查看django文档引入库   from django.contrib import messages

        -在registerPage函数下if通过时添加

    from django.contrib import messages
    
    
    
    def registerPage(request):
        form = CreatUserForm()
        if request.method=='POST':
            form = CreatUserForm(request.POST)
            if form.is_valid():
                form.save()
                user = form.cleaned_data.get('username')
                messages.success(request,'Accounts was created for '+ user)
                return redirect('login')
        context = {'form': form}
        return render(request,'accounts/register.html',context)

        -在login。html中添加{{message}}

              {% for message in messages %}
                        <p id="messages">{{message}}</p>
                    {% endfor %}

    D用户输入账号密码登录后的操作

        引入验证,登录,注销 库

        form django.contrib.auth import authenticate , login , logout

        -用户注册好账号密码 然后跳转到login页面登录

        -在loginPage函数下添加代码  

          -authenticate 目的是验证账号密码    login目的的进行登录  ( def  loginPage() 的起名才不会和这个相撞)

     def loginPage(request):
        if request.method =='POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            user = authenticate(request, username=username,password=password)
            if user is not None:
                login(request, user)
                return redirect('home')
            else:
                messages.info(request,'Account or Password is incorrect')
        return render(request, 'accounts/login.html')

        -关于注销

          - 在urls。py中增加  logout 的url 

          -在views中增加函数 logouUser

    def logoutUser(request):
        logout(request)
        return redirect('login')

          -要对Navtar.html中添加操作

      
    <style>
      .hello-msg{
        font-size: 18px;
        color: #fff;
        margin-right: 20px;
      }
    </style>
    
    <span class="hello-msg">Hello, {{request.user}}</span>
      <span ><a  class="hello-msg" href="{% url 'logout' %}">Logout</a></span>

    E 限制需要登录用户才能进入后台管理

        -引入 login装饰器库

        from django.contrib.auth.decorators import login_required

        -在每一个后台管理函数前面添加代码

        @loin_required(login_url = 'login')

    @login_required(login_url='login')
    def home(request):
        customer = Customer.objects.all()
        order = Order.objects.all()
        total_order = order.count()
        Delivered = Order.objects.filter(status='Delivered').count()
        Pending = Order.objects.filter(status='Pending').count()
    
        context = {'customer':customer,'order':order,'total_order':total_order,'Delivered':Delivered,'Pending':Pending}
    
        return render(request, 'accounts/home.html',context)

    F代码优化  (重定向)

        -对于已经登录了的用户 不需要也不想要再看见注册或登录页面 如果他们点击登录页面或注册页面 可以直接重定向带后台管理系统

        -引入库   

    from django.contrib.auth import authenticate
    def registerPage(request):
        if request.user.is_authenticated:
            return redirect('home')
        else:
            form = CreatUserForm()
            if request.method=='POST':
                form = CreatUserForm(request.POST)
                if form.is_valid():
                    form.save()
                    user = form.cleaned_data.get('username')
                    messages.success(request,'Accounts was created for '+ user)
                    return redirect('login')
            context = {'form': form}
            return render(request,'accounts/register.html',context)
    
    def loginPage(request):
        if request.user.is_authenticated:
            return redirect('home')
        else:
            if request.method =='POST':
                username = request.POST.get('username')
                password = request.POST.get('password')
                user = authenticate(request, username=username,password=password)
                if user is not None:
                    login(request, user)
                    return redirect('home')
                else:
                    messages.info(request,'Account or Password is incorrect')
            return render(request, 'accounts/login.html')
  • 相关阅读:
    2017寒假作业二 汇总随笔
    2017寒假作业一
    UVA 1601 POJ 3523 The Morning after Halloween 【双向BFS】【A*】 (好题)
    UVA 10570 Meeting with Aliens 【枚举+结论题】
    UVA 1614 Hell on the Markets 【贪心+结论题】
    UVA 10603 Fill【BFS】
    Codevs 1288 埃及分数 【IDA*】
    UVA 11212 Editing a Book 【IDA*】
    UVA 11624 Fire! 【特殊BFS】
    UVA 1599 Ideal Path 【两次BFS+贪心】 (好题)
  • 原文地址:https://www.cnblogs.com/kangkang1999/p/13401523.html
Copyright © 2011-2022 走看看