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 %}
相关文章
相关标签/搜索