可参考: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 %}
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>
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 %}