django MTV模型

可參考:http://www.runoob.com/django/django-admin-manage-tool.htmlhtml

https://code.ziqiangxuetang.com/django/django-tutorial.html前端

http://www.cnblogs.com/yuanchenqi/articles/6083427.htmlpython

 

pip  install django --trusted-host mirrors.aliyun.comweb

pycharm無提示能夠setting-language&frameworks-python template language中選擇django正則表達式

建立項目django-admin startproject 項目名shell

建立應用   python manage.py startapp blog數據庫

在pycharm的工具欄找到 Tools,點擊以後會有「Run manage.py task」選項,點擊它以後,在pycharm下面會出現一個輸入界面,在裏面輸入「startapp appName(你的App名稱)」,回車以後就能夠在工程下面看到你新建的App了。django

Model class blog.models.Userinfo doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.報錯可能緣由是settings.py未設置後端

建立數據庫app

python manage.py makemigrations  

python manage.py migrate

urls.py  url與視圖函數映射

urlpatterns = [
    url(正則表達式, views視圖函數,參數,別名),
]
可選的要傳遞給視圖函數的默認參數(字典形式)
eg :傳入默認參數
urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.res,{'respone':'hello'}),
]
views.py
def res(req,respone):
    return HttpResponse(respone)
別名 (做用防止每次路徑修改前端都要改)
urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.inde,name='ceshi')
]
前端html頁面直接用{%%}模板代替,注意,模板是後端解析的,前端無這用法
ceshi這個別名對應 login/ 若是你修改了urls 路徑未pay_login時,前端無需修改直接訪問ip:端口/pay_login/
<form action={%url "ceshi"%} method="post" enctype="multipart/form-data">
    <p>姓名:<input type="text" name="user"></p>
    <p>密碼:<input type="password"  name="passwd" ></p>
    <p>年齡:<input type="number" name="age"></p>
</form>

urls實現路由分發

做用:一個項目裏可能有多個app,爲了分擔壓力,全局urls做爲路由分發
項目的urls.py
from django.contrib import admin
from django.urls import path,include  #引入include 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', include('blog.urls'))   #全部login開頭的分發到blog.urls
]
在blog這個目錄裏咱們新建一個urls.py
from django.contrib import admin
from django.urls import path

from blog import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.inde,name='ceshi'),
    path('test/',views.cur_time)
]
訪問時直接ip:端口/login/login和ip:端口/login/test訪問  

 templetes(存放H5頁面)

settings設置

<!DOCTYPE html>
<html>
<head>
    <title>Python</title>
    <link rel="icon" href="https://common.cnblogs.com/favicon.ico"/>
    <meta charset="utf-8">
</head>
<body>
<form action={%url "ceshi"%} method="post" enctype="multipart/form-data">
    <p>姓名:<input type="text" name="user"></p>
    <p>密碼:<input type="password"  name="passwd" ></p>
    <p>年齡:<input type="number" name="age"></p>
    <p>性別:男<input type="radio" name="sex" value="man"><input type="radio" name="sex" value="women"></p>   <!--單選框 name值相同才能互斥-->
    <p><input type="file"  name="上傳" id="" ></p>
    <P><input type="reset" value="重置"></P>
    <p><input type="button" value="press"></p>   <!--配合CSS做爲觸發器-->
    <p><input type="submit" value="提交" onclick="press()"></p>
    <h1>當前時間:{{recent_time|date:'Y-m-d H:i:s'}}</h1>
</form>
<hr>
<h2>數據展現</h2>
<table>
    <tr>
        <td>姓名</td>
        <td>密碼</td>
        <td>年齡</td>
        <td>性別</td>
    </tr>
    {%for i in user%}
    <tr>
        <td>{{user.username}}</td>
        <td>{{user.password}}</td>
        <td>{{user.age}}</td>
        <td>{{user.sex}}</td>
    </tr>
    {% endfor %}
</table>
</body>
</html>

views.py(存放視圖函數)

from django.shortcuts import  render,HttpResponse,redirect
import datetime
from blog import models
from .apps import AppnameConfig
#user_list=[]
def inde(req):
    if req.method=="POST":
        username_f=req.POST.get("user",None)     #匹配前端name若是無值返回None
        age_f=req.POST.get("age",None)
        password_f=req.POST.get("passwd",None)
        sex_f=req.POST.get("sex",None)
        print(req.POST)
        print ("%-5s %-10s %-10s %-10s" %(username_f,password_f,age_f,sex_f))
        print("文件",req.FILES)
        # models.Userinfo.objects.create(
        #     username=username_f,
        #     age=age_f,
        #     password=password_f,
        #     sex=sex_f
        # )

        # user_dict={'username': username,
        #             'password':password,
        #            'age': age,
        #            'sex': sex}
        # user_list.append(user_dict)
        for item in req.FILES:   #文件上傳
            obj=req.FILES.get(item)
            filename=obj.name
            with open(filename,'wb') as f:
                for line in obj.chunks():
                    f.write(line)
    curent_time = datetime.datetime.now()
    user_list=models.Userinfo.objects.all()
    return render(req, "login.html",{"recent_time":curent_time,"user":user_list})    #{}鍵值對先後映射後端
def cur_time(req):
    curent_time=datetime.datetime.now()
    return render(req,"login.html",{"recent_time":curent_time})
def res(req,respone):
    return redirect("www.baidu.com")      #跳轉
def index(req):
    return render(req,"index.html",{"num":100})

templete與context(templete能夠複用)

模板語法

1.變量 {{變量名}} 

2句點號 eg 上面html代碼

3過濾器filter  語法{{obj|filter:param}}

# 1 add : 給變量加上相應的值
# 2 addslashes : 給變量中的引號前加上斜線
# 3 capfirst : 首字母大寫
# 4 cut : 從字符串中移除指定的字符
# 5 date : 格式化日期字符串
# 6 default : 若是值是False,就替換成設置的默認值,不然就是用原本的值
# 7 default_if_none: 若是值是None,就替換成設置的默認值,不然就使用原本的值

標籤tag 使用 {%tag%}

{%if%}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>python</title>
</head>
<body>
{% if num > 100 %}

    {% if num > 200 %}
        <p>num大於200</p>
    {% else %}
        <p>num大於100小於200</p>
    {% endif %}

{% elif num < 100%}
    <p>num小於100</p>

{% else %}
    <p>num等於100</p>

{% endif %}
</body>
</html>

{%for%} 參考templete代碼

{%csrf_token%}:csrf_token標籤

用於生成csrf_token的標籤,用於防治跨站攻擊驗證。注意若是你在view的index裏用的是render_to_response方法,不會生效

其實,這裏是會生成一個input標籤,和其餘表單標籤一塊兒提交給後臺的。

<form action="{% url "bieming"%}" >
          <input type="text">
          <input type="submit"value="提交">
          {%csrf_token%}
</form>

{% with %}:用更簡單的變量名替代複雜的變量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}

{% verbatim %}: 禁止render渲染
{% verbatim %}
{{ hello }}            #web直接展示{{hello}}
{% endverbatim %}

自定義filter和simple_tag

1在app中建立文件夾或者package 名字templatetags模塊(必須的,名字不能改)

2在templatetags下my_tags.py(任意 .py 文件)

from django import template
from django.utils.safestring import mark_safe

register = template.Library()   #register的名字是固定的,不可改變

@register.simple_tag   #與filter調用方式不通{% my_add num %},不能用於IF語句
def my_add(nums):
    return nums+20
@register.filter        #{參數不能超過2個 { num|my_add:2 }}
def my_add(nums,num):
    return nums+num+20

html執行

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>python</title>
</head>
<body>
{% load my_tags %}  {# 導入自定義tag模塊 #}
{% my_add num %}
<hr>
{{ num|my_add:2 }}
</body>
</html>

extend模板繼承(目的去除重複html代碼)

 ursl.py

from django.contrib import admin
from django.urls import path,include
from blog import views
urlpatterns = [
    path('userinfo/',views.userinfo),
    path('age/',views.age),
    path('habbix/',views.habbix)
]

views.py

# Create your views here.
from django.shortcuts import  render,HttpResponse,redirect
import datetime
from blog import models
from .apps import AppnameConfig
def userinfo(req):
    return  render(req,"user_info.html")
def age(req):
    return  render(req,'age.html')
def habbix(req):
    return render(req,"habbix.html")

user_info.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <div class="page_header" style="height: 30px;background: chartreuse"><a href="/userinfo/">用戶信息</a></div>
    <div class="page_body" style="height:500px;background: saddlebrown">
        <div class="memu" style="width: 30%;background: yellow;float: left;height: 500px">
            <div><a href="/habbix/">愛好</a></div>
            <div><a href="/age/">年齡</a></div>
        </div>
{#        <div class="content" style="width: 70%;background: seashell;float: right;height: 500px">#}
{#        </div>#}
        {% block content %}    {#模板,誰調用了模板本身填充block內容 #}
        {% endblock %}
    <div class="page_footer" style="height: 30px;background:#dc21be;clear: both">日期</div>
    </div>
</body>
</html>

habbix.html

{% extends "user_info.html" %}  {# 導入模板 #}
{% block content %}             {# content標籤內容 #}
    <div class="content" style="width: 70%;background: seashell;float: right;height: 500px">
            愛好
    </div>
{% endblock %}

age.html

{% extends "user_info.html" %}
{% block content %}
    <div class="content" style="width: 70%;background: seashell;float: right;height: 500px">
            年齡
    </div>
{% endblock %}
相關文章
相關標籤/搜索