Django 基礎(一),項目建立、URL路由、數據庫操做、模版

1、安裝Djangocss


下載地址:https://www.djangoproject.com/download/html


一、tar zxvf Django-1.8.10.tar.gzpython

二、cd Django-1.8.10mysql

三、python setup.py installgit


2、建立一個Django項目
web


django-admin startproject sitename正則表達式


經常使用命令:sql

  python manage.py runserver 0.0.0.0
  python manage.py startapp appname

  python manage.py syncdb
數據庫

# 集成已有數據庫的應用,經過數據庫生成model類django

       python manage.py inspectdb

# 經過model類生成數據庫
  python manage.py makemigrations
  python manage.py migrate


3、URL路由


一、每一個路由規則對應一個view中的函數

from django.conf.urls import include, url
from django.contrib import admin
from views import *

urlpatterns = [

    url('^hello/$',hello),
    url('^time/$',current_datetime),
    url(r'^time/plus/(\d{1,2})/$',hours_ahead),

]


二、根據app對應路由規則的分類

    url(r'^web1/',include('web1.urls'))


app:web1.urls

from django.conf.urls import include, url, patterns
from django.contrib import admin
from web1.views import *

urlpatterns = patterns('',

    url(r'^add/(?P<name>\w*)&(?P<not_name>\w*)/$',Add),
    url(r'^del/(?P<id>\d*)/$',Delete),
    url(r'^Update/(?P<id>\d*)&(?P<name>\w*)/$',Update),

)


添加app到框架應用

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'ops01',
)


4、數據庫操做


一、配置:

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}


二、根據models.Model建立數據表

#!/usr/local/python27/bin/python2.7
# coding:utf8  
# Create your models here.
from django.db import models

class UserInfo2(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    memo = models.CharField(max_length=50)

class args(models.Model):
    id = models.AutoField(primary_key = True)
    name = models.CharField(max_length=20,null=True)
    not_name = models.CharField(max_length=20,null=False)
    create_data = models.DateTimeField(auto_now_add = True)
    update_date = models.DateTimeField(auto_now = True,error_messages={"invalid":'日期格式錯誤'})


三、更多字段:

一、models.AutoField  
# 自增列 = int(11) 若是沒有的話,默認會生成一個名稱爲 id 的列,若是要顯示的自定義一個自增列,必須將給列設置爲主鍵 primary_key=True。
二、models.CharField
# 字符串字段必須 max_length 參數
三、models.BooleanField  布爾類型=tinyint(1)
# 不能爲空,Blank=True
四、models.ComaSeparatedIntegerField  
# 用逗號分割的數字=varchar 繼承CharField,因此必須 max_lenght 參數
五、models.DateField  
# 日期類型 date 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。
六、models.DateTimeField  
# 日期類型 datetime 同DateField的參數
七、models.Decimal 
# 十進制小數類型 = decimal 必須指定整數位max_digits和小數位decimal_places
八、models.EmailField  
# 字符串類型(正則表達式郵箱)=varchar 對字符串進行正則表達式
九、models.FloatField
# 浮點類型 = double
十、models.IntegerField  # ×××
十一、models.BigIntegerField # 長×××
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
十二、models.IPAddressField  
# 字符串類型(ip4正則表達式)
1三、models.GenericIPAddressField 
# 字符串類型(ip4和ip6是可選的)
# 參數protocol能夠是:both、ipv四、ipv6
# 驗證時,會根據設置報錯
1四、models.NullBooleanField  
# 容許爲空的布爾類型
1五、models.PositiveIntegerFiel # 正Integer
1六、models.PositiveSmallIntegerField # 正smallInteger
1七、models.SlugField  
# 減號、下劃線、字母、數字
1八、models.SmallIntegerField  
# 數字 數據庫中的字段有:tinyint、smallint、int、bigint
1九、models.TextField 
# 字符串=longtext
20、models.TimeField 
# 時間 HH:MM[:ss[.uuuuuu]]
2一、models.URLField 
# 字符串,地址正則表達式
2二、models.BinaryField  
# 二進制
2三、models.ImageField # 圖片
2四、models.FilePathField # 文件


四、更多字段參數:

一、null=True
# 數據庫中字段是否能夠爲空
二、blank=True
# django的 Admin 中添加數據時是否可容許空值
三、primary_key = False
# 主鍵,對AutoField設置主鍵後,就會代替原來的自增 id 列
四、auto_now 和 auto_now_add
# auto_now  自動建立---不管添加或修改,都是當前操做的時間
# auto_now_add  自動建立---永遠是建立時的時間
五、choices
# GENDER_CHOICE = (
#        (u'M', u'Male'),
#        (u'F', u'Female'),
#    )
# gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
六、max_length
七、default  # 默認值
八、verbose_name  # Admin中字段的顯示名稱
九、name|db_column # 數據庫中的字段名稱
十、unique=True  # 不容許重複
十一、db_index = True # 數據庫索引
十二、editable=True # 在Admin裏是否可編輯
1三、error_messages=None # 錯誤提示
1四、auto_created=False # 自動建立
1五、help_text  # 在Admin中提示幫助信息
1六、validators=[]
1七、upload-to


五、數據庫操做

from django.shortcuts import render
from web1.models import *
from django.http import HttpResponse
from django.db.models import Min,Max,Sum
from django.db import connection,transaction

# Create your views here.

# 添加數據
def Add(request,name,not_name):

    args.objects.create(not_name=not_name,name=name)
    return HttpResponse('ok')

# 刪除數據
def Delete(request,id):

    args.objects.get(id=id).delete()
    return HttpResponse('delete ok')

# 更新數據,單行更新        
def Update(request,id,name):

       
    obj = args.objects.get(id=id)
    obj.name = name
    obj.save()
    return HttpResponse('update ok')
    


# 根據id大於等於的條件,多行更新

    args.objects.filter(id__gt=id).update(name=name) 
    return HttpResponse('multi update ok')

# 根據id小於等於的條件,多行更新,也能夠用於多行刪除

    args.objects.filter(id__lt=id).update(name=name)
    return HttpResponse('multi update ok')

# 根據等於的條件多行操做
   
    args.objects.filter(id=id).update(name=name)
    return HttpResponse('multi update ok')    
    
#還能夠經過filter(id__in = [1,2,3])進行多行操做 
    

# 模糊查詢
obj = args.objects.filter(name__contains=name)

# 模糊查詢(忽略大小寫)
obj = q.exclude(body_text__icontains="food")

    
# -------- 條件查詢更多參數 -------------

# 表示!=
exclude 

# 去重複
querySet.distinct()  

# 精確等於 like 'aaa'
__exact  

# 精確等於 忽略大小寫 ilike 'aaa'      
__iexact  

# 包含 like '%aaa%' 
__contains    

# 包含,忽略大小寫 ilike '%aaa%',可是對於sqlite來講,contains的做用效果等同於icontains。
__icontains  

# 大於  
_gt  

# 大於等於 
__gte 

# 小於
__lt

# 小於等於
__lte

# 存在於一個list範圍內
__in

# 以...開頭
__startswith

# 以...開頭 忽略大小寫 
__istartswith

# 以...結尾 
__endswith

# 以...結尾,忽略大小寫
__iendswith

# 在...範圍內
__range

# 日期字段的年份
__year

# 日期字段的月份
__month

# 日期字段的日
__day

# 空集
__isnull=True/False
    
# 擴展學習,示例

# 大於
p1 = Permission.objects.all().filter(content_type_id__gt=12)

# 大於等於
p1 = Permission.objects.all().filter(content_type_id__gte=12)

# 去重
p1 = Permission.objects.all().filter(content_type_id__gte=12).distinct()

# 前綴查詢 
q1 = Entry.objects.filter(headline__startswith="What")

# 排除
q2 = q1.exclude(pub_date__gte=datetime.date.today())

# 操做時間
q1.filter(pub_date__gte=datetime.date.today())表示爲時間>=now,

q1.exclude(pub_date__gte=datetime.date.today())表示爲<=now

'''
關於緩存:
queryset是有緩存的,a = A.objects.all(),print [i for i in a].
第一次執行打印會查詢數據庫,而後結果會被保存在queryset內置的cache中,
再執行print的時候就會取自緩存。

不少時候會遇到僅需判斷queryset是否爲空的狀況,能夠
1. if queryset:pass 2.if queryset.count>0:pass 3.if queryset.exists():pass. 
三種方式性能依次提高。
當queryset很是巨大時,cache會成爲問題。
此時能夠queryset.iterator(),迭代器的用處就很少說了,根據具體需求狀況使用。
'''
    
    
# 經過values()指定獲取單列數據。

alldata = args.objects.all().values('id')
alldata = args.objects.values('id')

# 獲取單列去重數據
alldata = args.objects.values('id').distinct()


# 獲取指定行數據,[0:3] 從0行開始向下獲取3行數據

def get_limit(request):
    alldata = args.objects.all()[0:3]
    print alldata.query
    return HttpResponse(alldata)


# 排序 ,(‘-id’)爲逆序

    alldata = args.objects.all().order_by('id')  
    alldata = args.objects.all().order_by('-id')


# 聚合函數

def juhe(request):
    alldata = args.objects.aggregate(Max('id'))
    print alldata
    return HttpResponse(alldata)
    
        
# 使用自定義的原生SQL語句

'''
cursor = connection.cursor()
cursor.execute('SELECT DISTINCT first_name ROM people_person WHERE last_name = %s', ['Lennon'])
row = cursor.fetchone() 
'''

# 實例:
def sour_sql(request,id):
    cursor = connection.cursor()
    cursor.execute('''SELECT id FROM web1_args where id > %s ''' % id )
    row = cursor.fetchall()
    print row
    return HttpResponse(row)
    
# 經過調用SQL 函數inet_aton()將IP地址轉爲INT格式存儲
cursor = connection.cursor()
cursor.execute("SELECT inet_aton('%s')" % wip)
data = cursor.fetchall()
sqldatawip = data[0][0]

cursor.execute("SELECT inet_aton('%s')" % lip)
data = cursor.fetchall()
sqldatalip = data[0][0]

5、模版語言


一、模版文件夾路徑配置

Django1.8 setting.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 配置模版文件夾路徑
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]


二、判斷語句編寫格式

# 判斷
{% if not user %}

    <h2>have data</h2>

{% else %}

    <h2>haven't data</h2>

{% endif %}

# 取反判斷
{% if not user %}

    <h2>have data</h2>

{% else %}

    <h2>haven't data</h2>

{% endif %}


#  ifequal/ifnotequal 等價判斷,user 是否等於 'tuchao'

{% ifequal user 'tuchao' %}

    <h3>right!</h3>

{% else %}

    <h3>error!</h3>

{% endifequal %}


三、循環語句編寫

# 循環裝有數據的表格,使得頁面中有格式的顯示數據

{% for item in data %}
    <tr>

        <td>`item`.`id`</td>
        <td>{% mymethod item.id %}</td>
        <td>`item`.`name`</td>
        <td>`item`.`not_name`</td>
        <td>{{item.create_data|date:"Y-m-d H:i:s"}}</td>
        <td>{{item.update_date|date:"Y-m-d H:i:s"}}</td>

     </tr>
{% endfor %}


# 給標籤增長一個 reversed 使得該列表被反向迭代:

{% for athlete in athlete_list reversed %}
...
{% endfor %}


# 先檢查列表是否有數據再循環

{% if athlete_list %}
    {% for athlete in athlete_list %}
        <p>{{ athlete.name }}</p>
    {% endfor %}
{% else %}
    <p>There are no athletes. Only computer programmers.</p>
{% endif %}


# `` for`` 標籤支持一個可選的`` {% empty %}`` 分句,經過它咱們能夠定義當列表爲空時的輸出內容 下面的例子與以前那個等價:

{% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
{% empty %}
    <p>There are no athletes. Only computer programmers.</p>
{% endfor %}


# forloop.counter 老是一個表示當前循環的執行次數的整數計數器。 這個計數器是從1開始的,因此在第一次循環時 forloop.counter 將會被設置爲1。

{% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}


# forloop.last 是一個布爾值;在最後一次執行循環時被置爲True。 一個常見的用法是在一系列的連接之間放置管道符(|)

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}

# 上面的模板可能會產生以下的結果:

Link1 | Link2 | Link3 | Link4

# 另外一個常見的用途是爲列表的每一個單詞的加上逗號。

# Favorite places:
{% for p in places %}{{ p }}{% if not forloop.last %}, {% endif %}{% endfor %}


四、過濾器

    模版過濾器是在變量被顯示前修改它的值的一個簡單方法

# 內容變量 name 被過濾器lower處理-轉換文本爲小寫
{{ name|lower }}

# 過濾管道能夠被* 套接* ,既是說,一個過濾器管道的輸出又能夠做爲下一個管道的輸入

# 實現查找列表的第一個元素並將其轉化爲大寫

{{ my_list|first|upper }}

# 顯示 bio變量的前30個字符
{{ bio|truncatewords:"30" }}

# date 按照指定的格式,格式化date和datetime對象

{{create_data|date:"Y-m-d H:i:s"}}
{{update_date|date:"Y-m-d H:i:s"}}
{{delete_date|date:"F j, Y" }}

# addslashes : 添加反斜槓到任何反斜槓、單引號或者雙引號前面。 這在處理包含JavaScript的文本時是很是有用的。


五、自定義模版方法

一、在app目錄下建立templatetags文件夾,用於保存自定義方法文件

二、建立__init__.py文件

三、建立任意.py文件編寫自定義方法

# 代碼實例 hand.py

#!/usr/local/python27/bin/python2.7
#coding:utf-8
from django import template
from django.template.base import resolve_variable, Node, TemplateSyntaxError

register = template.Library()

#上面的均爲固定格式,注意這裏定義的方法必須被本身實例化的對象裏的裝飾器@register.simple_tag)進行裝飾纔有效

@register.simple_tag 
def mymethod(v1):
    result = v1*1000
    return result


Html調用自定義模版方法

{% extends "master/moban.html" %}

{% block content %}

<!-- 載入自定義方法文件 -->
{% load hand %} 
    <table border='1'>

        {% for item in data %}
            <tr>

            <td>`item`.`id`</td>
            <!-- 調用自定義方法,將id值乘1000返回 -->
            <td>{% mymethod item.id %}</td>
            <td>`item`.`name`</td>
            <td>`item`.`not_name`</td>

            </tr>
            {% endfor %}


六、模版的繼承


      當咱們在開發一個動態站點的時候,會發如今整個站點中不少頁面的樣式,圖片、Logo、導航欄等等都有相同的部分,那咱們如何減小這些冗餘代碼呢? 下面經過學習父板及子板繼承關係的方式來解決

# 定義一個父模版,其中的block塊是子板能夠重載的部分。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My helpful timestamp site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>

# 建立一個子板,繼承父模版

# 該標記用於指定繼承自哪一個父模版,必須保證其爲模板中的第一個模板標記。 不然,模板繼承將不起做用。
{% extends "base.html" %}

# 重載子板的title部分
{% block title %}The current time{% endblock %}

# 重載子板的內容部分
{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}

# 這個子模版的title 和 body 內容部分都本身定製不繼承自父模版,剩下沒有被重載的任何部分都繼承自父模版,如{% block footer %} 部分。


6、Django-form表單 

     

        Django 提供一個form.Form類能夠快速實現表單的功能,並且提供便捷的方式解決了驗證提交數據的格式是否合法的問題。


一、在app目錄下建立一個forms.py的文件

# 實例代碼

#!/usr/local/python27/bin/python2.7
# coding=utf8
# noinspection PyUnresolvedReferences

from django import forms


# 定義一部分須要用到的表單,attrs屬性用於定義該表單的樣式信息。 指定的樣式須要在對應的CSS文件中編寫。

class RegisterForm(forms.Form):
    username = forms.CharField(widget=forms.TextInput(attrs={'class':'user_name'}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={'class':'pwd'}))
    real_name = forms.CharField(widget=forms.TextInput)
    email = forms.EmailField(required=True,error_messages={'invalid':'郵箱格式錯誤'})
    gender = forms.BooleanField()


class AdminHostAdd(forms.Form):
    othername = forms.CharField(widget=forms.TextInput(attrs={'class':'othername'}))
    hostname = forms.CharField(widget=forms.TextInput(attrs={'class':'hostname'}))
    hardconfig = forms.CharField(widget=forms.TextInput(attrs={'class':'hardconfig'}))
    wip = forms.IPAddressField()
    lip = forms.IPAddressField()


二、views.py 文件中調用實例代碼

#!/usr/local/python27/bin/python2.7
# coding=utf8
# noinspection PyUnresolvedReferences

from django.shortcuts import render
# 從定義的forms.py文件中導入類
from ops01.forms import RegisterForm,AdminHostAdd
from django.http import HttpResponse
from django.shortcuts import render_to_response
from ops01.models import *
from django.db import connection,transaction

# 用戶註冊函數
def Register(request):
    reg = RegisterForm() # 實例化

    if request.method == 'POST':
        form = RegisterForm(request.POST)
        # 判斷提交的表單數據,是否符合表單定義的數據格式。
        if form.is_valid(): 
            # 獲取提交的全部數據,這裏會返回一個字典對象
            data = form.cleaned_data
            username = data.get('username')
            password = data.get('password')
            realname = data.get('real_name')
            email = data.get('email')
            try:
                # 數據庫操做,將合法的數據記錄到數據庫
                user.objects.create(username=username,password=password,realname=realname,email=email)
            except e:
                print (e)

            print data
        else:
            temp = form.errors.as_data()
            print temp
            print type(temp)
            # 在返回結果的時候將實例化的form對象reg嵌套進Html一塊兒返回
            return render_to_response('register.html',{'form':reg,'status':'註冊失敗'})
    return render_to_response('register.html',{'form':reg})
    

# 主機信息添加函數
def hostinfoadd(request):
    hostadd = AdminHostAdd()
    if request.method == 'POST':
        form = AdminHostAdd(request.POST)
        if form.is_valid():
            data = form.cleaned_data

            hostname = data.get('hostname')
            othername = data.get('othername')
            wip = data.get('wip')
            lip = data.get('lip')
            hardconfig = data.get('hardconfig')

            cursor = connection.cursor()
            cursor.execute("SELECT inet_aton('%s')" % wip)
            data = cursor.fetchall()
            sqldatawip = data[0][0]

            cursor.execute("SELECT inet_aton('%s')" % lip)
            data = cursor.fetchall()
            sqldatalip = data[0][0]
            try:
                host.objects.create(othername=othername,hostname=hostname,wanip=sqldatawip,lanip=sqldatalip,hardconfig=hardconfig)
            except e:
                print e

            return render_to_response('admin-host-add.html',{'form':hostadd,'status':'記錄添加成功!'})

        else:
            return render_to_response('admin-host-add.html',{'form':hostadd,'status':'數據格式錯誤!'})

    return render_to_response('admin-host-add.html',{'form':hostadd})


三、對應的部分Html實例代碼


# 註冊頁面

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>帳戶註冊</title>
<style type="text/css" >

.title{
  font-size: 25px;
  font-weight: bold;
  display: block;
  margin-left: 46%;
  margin-top: 40px;
}

.regdiv{
  background: #FFF;
  height: 500px;
  width: 450px;
  left: 470px;
  position: relative;
  top: 53px;
   
}

.reghead{
  height: 41px;
  position: absolute;
  width: 100%;
  top: 30px;
  line-height: 0px;
  border-bottom: 1px solid #F2F2F2;
}

.reghead h3{
  font-size: 21px;
  left: 19px;
  display: block;
  position: absolute;
}

.r_name{
    height: 50px;
    position: absolute;
    width: 100%;
    top: 105px;
    left: 12px;
}

.u_name{
    height: 30px;
    position: absolute;
    width: 100%;
    top: 180px;
    left: 12px;
}

.passwd{
    height: 30px;
    position: absolute;
    top: 255px;
    left: 12px;

}

.mail{
    height: 30px;
    top: 327px;
    position: absolute;
    width: 100%;
    left: 12px;
}

.mail input{
    height:30px;
    width: 300px;

}
    
.r_name input{

    width: 300px;
    height: 30px;
}

.user_name {
    height: 30px;
    width: 300px;
}
.pwd{
    width: 300px;
    height: 30px;
}
    
.sub {
  height: 32px;
  position: absolute;
  bottom: 42px;
  left: 83px;
}
.sub input {
  padding: 8px;
  width: 300px;
  background-color: rgb(53, 84, 146);
  font-size: 20px;
  font-weight: bold;
  color: #FFF;
}

.gd{
    bottom: 94px;
    left: 80px;
    font-size: 14px;
    position: absolute;
}

.failstatus{
    color: #ff2d28;
    width: 222px;
    display: block;
    position: absolute;
    height: 51px;
    left: 141px;
    top: 32px;
    font-size: 28px;
    font-family: "Microsoft YaHei";
    font-weight: bold;
    letter-spacing: 14px;
}
</style>

</head>

<body style="background:#D6E4FF; margin:0px auto; height:920px;">

<span class="title">Regsiter Page</span>

<div class="regdiv">
<div class="reghead"><h3>註冊</h3></div>
<!-- 經過模版語言調用經過 render_to_response 方法傳入的字典對象 -->
    <span class="failstatus">{{ status }}</span>

    <form action="/ops01/reg/" method="post">
<!-- 經過模版語言的格式調用form -->
        <div class="r_name">真實姓名:{{ form.real_name }}</div>
        <div class="u_name">用 戶 名:{{ form.username }}</div>
        <div class="passwd">密&nbsp;&nbsp;碼:{{ form.password }}</div>
        <div class="mail">郵&nbsp;&nbsp;箱:{{ form.email }}</div>
        <div class="gd">{{ form.gender }}我已經贊成<a href="#">隱私政策、服務條款</a></div>
        <div class="sub"><input type="submit" value="注&nbsp;冊" /></div>

    </form>



</div>

</body>
</html>

<!-- -------------------------------------------------------------------------------- -->
<!-- 主機信息添加頁 -->

{% extends "masterplate.html" %}


{% block title %}主機添加{% endblock %}

{% block content %}
    <div class="admin-content-admin-host-add content_font">
    <div class="am-cf am-padding">
      <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">主機信息添加</strong> / <small>Host information add</small></div>
    </div>
        <hr />
        <form action="/ops01/hostadd/" method="post">
            <div style="margin-left: 20px;">
            主機名<hr />
            {{ form.hostname }}<hr />
            </div>

            <div style="margin-left: 20px;">
            別名<hr />
            {{ form.othername }}<hr />
            </div>

            <div style="margin-left: 20px;">
            外網IP<hr />
            <div class="wipdiv">{{ form.wip }}</div><hr />
            </div>

            <div style="margin-left: 20px;">
            內網IP<hr />
            <div class="lipdiv">{{ form.lip }}</div><hr />
            </div>

            <div style="margin-left: 20px;">
            硬件配置<hr />
            {{ form.hardconfig }}<hr />
            </div>

            <span class="hostaddstatus">{{ status }}</span>

            <div class="hostaddbottomdiv"><input type="submit" class="hostaddbottom" name="hostinfosubmit" value="提交至數據庫" /></div>

        </form>

    </div>
{% endblock %}

<!-- -------------------------------------------------------------------------------- -->

<!-- 主機列表頁面 -->

{% extends "masterplate.html" %}

{% block title %}主機列表{% endblock %}

{% block content %}
    <div class="admin-content">
    <div class="am-cf am-padding">
      <div class="am-fl am-cf"><strong class="am-text-primary am-text-lg">主機列表</strong> / <small>Host information</small></div>
    </div>

    <table border="1" class="hovertable">

        <tr>

        <th>主機ID</th><th>主機名</th><th>所屬業務</th><th>內網IP</th><th>外網IP</th><th>配置信息</th>

        </tr>

        {% for i in list %}

        <tr onmouseover="this.style.backgroundColor='#ffff66';" onmouseout="this.style.backgroundColor='#d4e3e5';">
            <td>{{ i.hid }}</td>
            <td>{{ i.hostname }}</td>
            <td>{{ i.othername }}</td>
            <td>{{ i.wanip }}</td>
            <td>{{ i.lanip }}</td>
            <td>{{ i.hardconfig }}</td>
        </tr>

        {% endfor %}

    </table>

    </div>
{% endblock %}


7、靜態文件存放配置

STATIC_URL = '/static/'

STATICFILES_DIRS = (
        os.path.join(BASE_DIR,'static'),
    )
相關文章
相關標籤/搜索