初探Django創(chuàng)建前臺(二)

上一篇創(chuàng)建了Django的后臺终息,今天來創(chuàng)建前臺視圖

創(chuàng)建Django首頁視圖

編輯視圖函數(shù)views.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import render


def index(request):
    # render()構造HttpResponse
    # context: 將index.html中的變量替換為context傳遞的變量,
    # {{ words}}替換為'words'的值
    words = 'World!'
    return render(request, 'index.html', context={'words': words})

創(chuàng)建完成后罩句,在django_student同級目錄下創(chuàng)建templates文件夾并創(chuàng)建index.html文件

├─django_student
│  │  admin.py
│  │  admin.pyc
│  │  apps.py
│  │  forms.py
│  │  forms.pyc
│  │  models.py
│  │  models.pyc
│  │  tests.py
│  │  views.py
│  │  views.pyc
│  │  __init__.py
│  │  __init__.pyc
│  │
│  ├─migrations
│  │      0001_initial.py
│  │      0001_initial.pyc
│  │      0002_student_home_phone.py
│  │      0002_student_home_phone.pyc
│  │      __init__.py
│  │      __init__.pyc
│  │
│  └─templates
│          index.html
│          __init__.py

我們在index.html內寫入如下代碼膏孟, {{ words }}是模板變量,在views.py中指定了context來傳遞模板變量的值

<!DOCTYPE html>
<html>
    <head>
        <title>學員管理系統(tǒng)</title>
    </head>
    <body>
        Hello {{ words }}!
    </body>
</html>

接下來磕谅,還需要再配置下django_student/urls.py器腋,讓用戶訪問url時把數(shù)據(jù)發(fā)送到定義的index這個視圖音比,使用正則表達式來匹配

<!DOCTYPE html>
<html>
from django.conf.urls import url
from django.contrib import admin
from student.views import index


urlpatterns = [
    url(r'^$', index, name='index'),
    url(r'^admin/', admin.site.urls),
]

開啟服務纺非,訪問下網(wǎng)頁语盈,會出現(xiàn)Hello舱馅,World!

python manage.py runserver

輸出數(shù)據(jù)

將后臺數(shù)據(jù)渲染到頁面上刀荒,現(xiàn)在admin中創(chuàng)建幾條數(shù)據(jù)
修改views.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import render

from .models import Student


def index(request):
    # Student.objects.all(): 獲取所有數(shù)據(jù)
    students = Student.objects.all()
    return render(request, 'index.html', context={'students': students})

修改index.html中代碼
{ % % }是模板標簽代嗤,先用for循環(huán)將students一個個取出來
{% endfor %}:循環(huán)結束了
{{ student.get_status_display }}:我們在models.py中定義了status字段,設置了choices來獲取對應的值
我們還可以在index.html中設置admin后臺鏈接

<!DOCTYPE html>
<html>
    <head>
        <title>學員管理系統(tǒng)</title>
    </head>
    <body>
        <a href="/admin/">Admin</a>
        <ul>
        {% for student in students %}
            <li>{{ student.name }} - {{ student.get_status_display }}</li>
        {% endfor %}
        </ul>
    </body>
</html>

再次運行服務缠借,查看網(wǎng)頁


django_test2.png

提交數(shù)據(jù)

這里我們用上了表單Form干毅,在views.py同級目錄下創(chuàng)建forms.p

# coding:utf-8
from __future__ import unicode_literals

from django import forms

from .models import Student


class StudentForm(forms.Form):
    name = forms.CharField(label='姓名', max_length=128)
    sex = forms.ChoiceField(label='性別', choices=Student.SEX_ITEMS)
    profession = forms.CharField(label='職業(yè)', max_length=128)
    email = forms.EmailField(label='郵箱', max_length=128)
    qq = forms.CharField(label='QQ', max_length=128)
    phone = forms.CharField(label='手機', max_length=128)

代碼和定義models.py很相似,可以使用繼承ModelForm來縮小代碼量

# coding:utf-8
from __future__ import unicode_literals

from django import forms

from .models import Student


class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = (
            'name', 'sex', 'profession',
            'email', 'qq', 'phone'
        )

接下來我們需要修改視圖函數(shù)views.py泼返,在頁面中展示表單Form硝逢,對于提交的數(shù)據(jù)做校驗,通過后存入數(shù)據(jù)庫

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.http import HttpResponseRedirect
from django.urls import reverse
from django.shortcuts import render

from .models import Student
from .forms import StudentForm


def index(request):
    # render()構造HttpResponse
    # context: 將index.html中的變量替換為context傳遞的變量,
    # {{ words}}替換為'words'的值
    # form.cleaned_data:是Django的form是對用戶提交的數(shù)據(jù)根據(jù)字段類型做完轉換后的結果
    # words = 'World'
    students = Student.objects.all()
    if request.method == 'POST':
        form = StudentForm(request.POST)
        if form.is_valid():
            cleaned_data = form.cleaned_data
            student = Student()
            student.name = cleaned_data['name']
            student.sex = cleaned_data['sex']
            student.email = cleaned_data['email']
            student.profession = cleaned_data['profession']
            student.qq = cleaned_data['qq']
            student.phone = cleaned_data['phone']
            student.save()
            # reverse():urls.py中和index對應
            # HttpResponseRedirect()重定向到我們的首頁
            return HttpResponseRedirect(reverse('index'))
    else:
        form = StudentForm()

    context = {
        'students': students,
        'form': form,
    }

    # return render(request, 'index.html', context={'words': words})
    return render(request, 'index.html', context=context)

接下來要把form傳入模板中绅喉,才能在頁面顯示表單
{% csrf_token %}:設置安全渠鸽,跨站偽造請求攻擊

<!DOCTYPE html>
<html>
    <head>
        <title>學院管理系統(tǒng)</title>
    </head>
    <body>
        <a href="/admin/">Admin</a>
        <ul>
            {% for student in students %}
                <li>{{ student.name }} - {{ student.get_status_display }}</li>
            {% endfor %}
        </ul>
        <hr/>
        <form action="/" method="post">
            {% csrf_token %}
            {{ form }}
            <input type="submit" value="Submit" />
        </form>
    </body>
</html>


校驗數(shù)字

以上步驟完成后,我們發(fā)現(xiàn)電話和QQ輸入字符沒有限制柴罐,可以使用IntegerField()來設置字符類型徽缚,或者使用clean來做限制,修改forms.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django import forms
from .models import Student


'''
class StudentForm(forms.Form):
    name = forms.CharField(label='姓名', max_length=128)
    sex = forms.ChoiceField(label='性別', choices=Student.SEX_ITEMS)
    profession = forms.CharField(label='職業(yè)', max_length=128)
    email = forms.EmailField(label='郵箱', max_length=128)
    qq = forms.CharField(label='QQ', max_length=128)
    phone = forms.CharField(label='手機', max_length=128)
'''
# 通過繼承ModelForm革屠,來寫下我們需要展示的fields
class StudentForm(forms.ModelForm):
    def clean_qq(self):
        cleaned_data = self.cleaned_data['qq']
        # isdigit():驗證是否是數(shù)字
        if not cleaned_data.isdigit():
            raise forms.ValidationError('必須是數(shù)字凿试!')
        return int(cleaned_data)

    def clean_phone(self):
        cleaned_data = self.cleaned_data['phone']
        if not cleaned_data.isdigit():
            raise forms.ValidationError('必須是數(shù)字!')
        return int(cleaned_data)



    class Meta:
        model = Student
        fields = (
            'name', 'sex', 'profession',
            'email', 'qq', 'phone',
        )

運行服務

python manage.py runserver


django_test3.png

修改為數(shù)字再次提交就OK了

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末似芝,一起剝皮案震驚了整個濱河市那婉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌党瓮,老刑警劉巖详炬,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寞奸,居然都是意外死亡痕寓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門蝇闭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呻率,“玉大人,你說我怎么就攤上這事呻引±裾蹋” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長元践。 經(jīng)常有香客問我韭脊,道長,這世上最難降的妖魔是什么单旁? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任沪羔,我火速辦了婚禮,結果婚禮上象浑,老公的妹妹穿的比我還像新娘蔫饰。我一直安慰自己,他們只是感情好愉豺,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布篓吁。 她就那樣靜靜地躺著,像睡著了一般蚪拦。 火紅的嫁衣襯著肌膚如雪杖剪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天驰贷,我揣著相機與錄音盛嘿,去河邊找鬼。 笑死括袒,一個胖子當著我的面吹牛次兆,可吹牛的內容都是我干的。 我是一名探鬼主播箱熬,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼类垦,長吁一口氣:“原來是場噩夢啊……” “哼狈邑!你這毒婦竟也來了城须?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤米苹,失蹤者是張志新(化名)和其女友劉穎糕伐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蘸嘶,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡良瞧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了训唱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褥蚯。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖况增,靈堂內的尸體忽然破棺而出赞庶,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布歧强,位于F島的核電站澜薄,受9級特大地震影響,放射性物質發(fā)生泄漏摊册。R本人自食惡果不足惜肤京,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茅特。 院中可真熱鬧忘分,春花似錦、人聲如沸温治。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熬荆。三九已至舟山,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卤恳,已是汗流浹背累盗。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留突琳,地道東北人若债。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像拆融,于是被迫代替她去往敵國和親蠢琳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內容