• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Django學習生涯_02

    標簽: Django  學習

    Django學習—學員管理系統前臺開發

    開發首頁

    在student/view.py文件下編寫代碼

    from django.shortcuts import render
    
    # Create your views here.
    
    def index(request):
        """首頁"""
        words = "Hello world!"
        return render(request, 'index.html', context={'words':words})
    

    定義函數index,參數為request,它是Django對用戶發送過來的HTTP請求的封裝。
    函數返回值使用render渲染頁面,使用了模板index.html。

    然后在student目錄下創建templates文件夾用來存放模板文件,templates文件夾為Django渲染頁面時默認查找。
    開始編寫index.html代碼

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>學員管理系統</title>
    </head>
    <body>
        歡迎登陸!{{ words }}
    </body>
    </html>
    

    {{ words }} 使用Django模板語法,意思是從上下文中獲取到words變量。這個變量在index調用時傳遞過來。

    接下來配置URL。然用戶訪問URL時把數據發送到我們定義的index這個View上。
    修改student目錄下的urls.py文件

    from django.contrib import admin
    from django.conf.urls import url
    
    from student.views import index
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),  # 后臺管理
        url(r"^$", index, name="index"),  # 網站首頁
    ]
    

    通過python manage.py runserver命令啟動項目,訪問http://127.0.0.1:8000
    看到網站首頁
    學員管理系統網站首頁

    輸出數據

    通過admin后臺創建幾條學員數據
    添加四條學員數據
    修改view.py中的代碼

    from django.shortcuts import render
    from .models import Student
    
    # Create your views here.
    
    def index(request):
        """首頁"""
        words = "Hello studens!"
        students = Student.objects.all()
        context = {
            'words': words,
            'students': students,
        }
        return render(request, 'index.html', context)
    

    通過Student模型拿到所有student的數據,接著把數據放到context里面傳遞到模板中。

    接著修改index.html中的代碼

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>學員管理系統</title>
    </head>
    <body>
        歡迎登陸!<br>
        {{ words }}
        <ul>
            {% for student in students %}
            <li>{{ student.name }}  --  {{ student.get_status_display }}</li>
            {% endfor %}
        </ul>
    </body>
    </html>
    

    {{ student.get_status_display }}對于設置了choices的字段,Django會幫我們提供一個方法,用來獲取這個字段要展示的值。

    重新訪問http://127.0.0.1:8000/
    學員管理首頁

    提交數據

    在views.py的同級目錄創建forms.py文件

    from django import forms
    from .models import Student
    
    
    class StudentForm(forms.ModelForm):
        """學生數據表單"""
        def clean_qq(self):
            """修改字段類型"""
            cleaned_data = self.cleaned_data['qq']
            if not cleaned_data.isdigit():
                raise forms.ValidationError('必須是數字!')
            
            return int(cleaned_data)
        
        class Meta:
            model = Student
            fields = (
                'name', 'sex', 'profession', 'email', 'qq', 'phone'
            )
    

    clean方法用來修改對應的字段類型
    isdigit 方法主要用于檢查其參數是否為十進制數字字符。
    raise 觸發異常后,后面的代碼就不會再執行
    如果驗證失敗,返回錯誤信息,其中錯誤信息將被存儲在form中,最終被渲染到頁面上。

    在頁面中展示Form,讓用戶能夠通過填寫信息提交表單,同時驗證提交的數據是否符合要求,通過后再將其保存到數據庫中。

    修改view.py文件

    from django.http import HttpResponseRedirect
    from django.shortcuts import render
    from django.urls import reverse
    
    from .forms import StudentForm
    from .models import Student
    
    # Create your views here.
    
    
    def index(request):
        """首頁"""
        words = "Hello studens!"
        students = Student.objects.all()
        if request.method == 'POST':  # 提交表單將通過post請求網站
            form = StudentForm(request.POST)
            if form.is_valid():
                cleaned_date = form.cleaned_data
                student = Student
                student.name = cleaned_date['name']
                student.sex = cleaned_date['sex']
                student.email = cleaned_date['email']
                student.profession = cleaned_date['profession']
                student.qq = cleaned_date['qq']
                student.phone = cleaned_date['phone']
                student.save()  # 保存到數據庫
                return HttpResponseRedirect(reverse('index'))  # 成功后返回到網站首頁
        else:
            form = StudentForm()
        
        # 組織上下文
        context = {
            'form': form,
            'words': words,
            'students': students,
        }
        return render(request, 'index.html', context=context)
    

    is_calia是一個校驗機制
    form.cleaned_data對象,它是Form根據字段類型對用戶提交的數據做完轉換之后的結果。
    reverse方法,在urls.py中定義了index的時候,聲明了name=‘index’,所以可以通過reverse來拿到對應的URL。

    上面我們通過Student對象的方法來保存Student數據,其實在ModelForm中,因為有了Model的定義,所以手動構建Student的步驟可以省去,下面修改view.py的代碼

    from django.http import HttpResponseRedirect
    from django.shortcuts import render
    from django.urls import reverse
    
    from .forms import StudentForm
    from .models import Student
    
    # Create your views here.
    
    
    def index(request):
        """首頁"""
        words = "Hello studens!"
        students = Student.objects.all()
        if request.method == 'POST':  # 提交表單將通過post請求網站
            form = StudentForm(request.POST)
            if form.is_valid():
                # cleaned_date = form.cleaned_data
                # student = Student
                # student.name = cleaned_date['name']
                # student.sex = cleaned_date['sex']
                # student.email = cleaned_date['email']
                # student.profession = cleaned_date['profession']
                # student.qq = cleaned_date['qq']
                # student.phone = cleaned_date['phone']
                form.save()  # 保存到數據庫
                return HttpResponseRedirect(reverse('index'))  # 成功后返回到網站首頁
        else:
            form = StudentForm()
        
        # 組織上下文
        context = {
            'form': form,
            'words': words,
            'students': students,
        }
        return render(request, 'index.html', context=context)
    

    對于HTTP GET請求的數據,我們要將StudentForm的實例傳到模板中
    在模板中添加form,修改index.html的代碼:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>學員管理系統</title>
    </head>
    <body>
        <h2>歡迎登陸!</h2><br>
        <h3><a href="/admin">管理員(admin)</a></h3>
        
        {{ words }}
        <ul>
            {% for student in students %}
            <li>{{ student.name }}  --  {{ student.get_status_display }}</li>
            {% endfor %}
        </ul>
        <br />
        <hr />
        <form action="/" method="post">
            {% csrf_token %}
            {{ form }}
            <input type="submit" value="提交">
        </form>
    </body>
    </html>
    

    {% scrf_token %}是Django對提交數據安全性做的校驗。post提交數據時加上{% scrf_token %}是防止跨站請求攻擊的一種手段。

    訪問網站首頁
    添加小明的數據
    網站首頁

    優化數據

    在view函數通過student = Student.objects.all()的方式獲取到所有學生的數據
    但考慮到后期會要求顯示過濾之后的學生數據,所以調整view.py中的代碼

    from django.db import models
    
    # Create your models here.
    
    class Student(models.Model):
        """學生管理類"""
        SEX_ITEMS = [
            (1, '男'),
            (2, '女'),
            (0, '未知'),
        ]
        STATUS_ITEMS = [
            (0, '申請'),
            (1, '通過'),
            (2, '拒絕'),
        ]
        name = models.CharField(max_length=128, verbose_name="姓名")
        sex = models.IntegerField(choices=SEX_ITEMS, verbose_name="性別")
        profession = models.CharField(max_length=30, verbose_name="職業")
        email = models.EmailField(verbose_name="Email")
        qq = models.CharField(max_length=20, verbose_name="QQ")
        phone = models.CharField(max_length=20, verbose_name="電話")
    
        status = models.IntegerField(choices=STATUS_ITEMS, default=0, verbose_name="審核狀態")
        create_time = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="創建時間")
    
        def __str__(self):
            return '<Student: {}>'.format(self.name)
        
        @classmethod
        def get_all(cls):
            return cls.objects.all()
    
        class Mete:
            verbose_name = verbose_name_plural = "學員信息"
    

    同時修改view.py中的代碼:

    from django.http import HttpResponseRedirect
    from django.shortcuts import render
    from django.urls import reverse
    
    from .forms import StudentForm
    from .models import Student
    
    # Create your views here.
    
    
    def index(request):
        """首頁"""
        words = "Hello studens!"
        # students = Student.objects.all()
        students = Student.get_all()
        if request.method == 'POST':  # 提交表單將通過post請求網站
            form = StudentForm(request.POST)
            if form.is_valid():
                # cleaned_date = form.cleaned_data
                # student = Student
                # student.name = cleaned_date['name']
                # student.sex = cleaned_date['sex']
                # student.email = cleaned_date['email']
                # student.profession = cleaned_date['profession']
                # student.qq = cleaned_date['qq']
                # student.phone = cleaned_date['phone']
                form.save()  # 保存到數據庫
                return HttpResponseRedirect(reverse('index'))  # 成功后返回到網站首頁
        else:
            form = StudentForm()
    
        # 組織上下文
        context = {
            'form': form,
            'words': words,
            'students': students,
        }
        return render(request, 'index.html', context=context)
    

    訪問網站首頁
    網站首頁

    版權聲明:本文為qq_39606546原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_39606546/article/details/93368385

    智能推薦

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    猜你喜歡

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    19.vue中封裝echarts組件

    19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...

    劍指Offer39-調整數組順序使奇數位于偶數前面

    一開始想著用冒泡排序的方法來做,但是bug還是很多,后來看了評論區答案,發現直接空間換時間是最簡單的,而且和快排的寫法是類似的。...

    【一只蒟蒻的刷題歷程】【藍橋杯】歷屆試題 九宮重排 (八數碼問題:BFS+集合set)

    資源限制 時間限制:1.0s 內存限制:256.0MB 問題描述 如下面第一個圖的九宮格中,放著 1~8 的數字卡片,還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。 我們把第一個圖的局面記為:12345678. 把第二個圖的局面記為:123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。 本題目的任務是已知九宮的初態...

    dataV組件容器寬高發生變化后,組件不會自適應解決方法

    項目中需要大屏幕數據展示,于是使用了dataV組件,但是使用是發現拖動瀏覽器邊框,dataV組件顯示異常,如圖: 于是查了官網,官網的解釋如下:   于是按照官網的意思編寫代碼: 于是可以自適應了...

    精品国产乱码久久久久久蜜桃不卡