文章目录
- 一、主要内容:
- 二、创建Django项目,这个参照 项目学习_1
- 2.1 创建项目
- 2.2 创建后台APP
- 2.2 创建超级用户
- 2.3 数据库新建数据库
- 2.4 创建文件夹
- 2.5 修改back_stage_management/settings.py文件
- 2.6 News/models.py
- 2.7 数据库更新
- 2.8 修改views.py
- 2.9 修改urls.py
- 2.10 Django自带后台插入数据
- 2.11 中英文设置和地区设置settings.py
- 三、数据库html操作
- 3.1 得到base.html
- 3.2 创建文件,用于继承base.html
- 3.3 后台调用数据
- 四、admin页操作http://127.0.0.1:8000/admin/
- 4.1 对数据库的操作
- 4.2 修改admin页的显示项,美化
- 五、html的forms使用
- 5.1 建表User, 修改models.py
- 5.2 同步到数据库
- 5.3 新建forms.html
- 5.4 修改views.py文件, 返回请求数据, hash加密
- 5.5 修改urls.py
- 5.6 结果
- 六、Django自带的forms使用
- 6.1 新建News/forms.py,用于存放表单
- 6.2 views.py调用表单forms
- 6.3 新建django_forms.html
- 6.4 urls.py添加 略
承接
Django项目学习_1
一、主要内容:
- 继承页面
- 页面调用后台数据库
- win10 python3.6.8 Django 1.8.2
二、创建Django项目,这个参照 项目学习_1
2.1 创建项目
django-admin startproject back_stage_management
2.2 创建后台APP
python manage.py startapp News
2.2 创建超级用户
python manage.py createsuperuser
2.3 数据库新建数据库
mysql> create database news default character set utf8;
2.4 创建文件夹
back_stage_management/template/
back_stage_management/static/
2.5 修改back_stage_management/settings.py文件
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'News', # zjq添加 刚刚创建app的名字
)
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, "template".replace("\\",'/')),
os.path.join(BASE_DIR, "News".replace("\\",'/')),
],
'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',
],
},
},
]
DATABASES = {
'default': {
# 默认数据库
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# zjq 配置mysql
'ENGINE': 'django.db.backends.mysql',
'NAME': 'news', # 注意这个数据库通过root用户需要新建
'HOST':'localhost',
'USER':'root',
'PASSWORD':'zjq',
'PORT':3306, # 默认不用加
}
}
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static".replace("\\", "/")), # 添加静态文件加的路径到工程
)
2.6 News/models.py
from django.db import models
# Create your models here.
class News(models.Model):
title = models.CharField(max_length=32)
author = models.CharField(max_length=32)
data = models.DateField()
content= models.TextField()
src = models.CharField(max_length=64)
delete_flag = models.CharField(max_length=4)
2.7 数据库更新
-
python manage.py validate
出错:Error loading MySQLdb module
安装`pip install pymysql`
修改同名文件夹在的__init__.py增加
import pymysql
pymysql.install_as_MySQLdb()
-
python manage.py makemigrations
-
python manage.py syncdb
如果这里是第一次运行, 会建议创建超级用户, 也就是该服务器Django的管理员
You have installed Django's auth system, and don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'zjq'): zjq
Email address: xxx@qq.com
Password:
Password (again):
Superuser created successfully.
2.8 修改views.py
from django.shortcuts import render
from django.shortcuts import render_to_response
# Create your views here.
from .models import News # 这个News就是刚创建的数据库类
def news(request):
name = "admin"
age = "999"
return render_to_response("news.html", locals())
2.9 修改urls.py
from django.conf.urls import include, url
from django.contrib import admin
from News.views import *
urlpatterns = [
url(r'^admin/', include(admin.site.urls)), # 注意这里要把后面的$去掉
url(r'^news/', news),
]
2.10 Django自带后台插入数据
修改admin.py
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(News) # 安装模型
127.0.0.1:8000/admin/
newss的add多组插入数据
2.11 中英文设置和地区设置settings.py
LANGUAGE_CODE = 'en-us'
# LANGUAGE_CODE = 'zh-hans' # 汉字
TIME_ZONE = 'Asia/Shanghai' # 设置上海地区
# TIME_ZONE = 'UTC'
三、数据库html操作
3.1 得到base.html
首先浏览器访问西北大学主页面, 然后Ctrl+S下载页面, 下载完成后会有一个html页面和一个西北大学的文件夹(包含html需要的image, js, css)
将文件夹内的三种文件分别保存到工程文档的static中的对应的文件夹中,同时将修改html中的文件路径,修改为static
问什么这样做呢,因为西北大学主页就已经是比较完美的, 正好使用这个页面作为base页, 而后展开下面的教学
- 下载的数据分类保存到下面几个文件夹内
- 将下载的HTML文件的内容复制到base.html中,然后将里面的路径修改为类似如下
"/static/css/xxxx.css"
"/static/js/xxxx.js"
"/static/image/xxxx.jpg"
- 修改base.html
删除关于讲座报告栏的div
删除结果如下图所示 - 代码如下:
<title>
{% block title %}
西北大学
{% endblock %}
</title>
<div class="main-lecture wp-col3-2 mx-fl">
<div class="main-header">
<h2>
<a href="http://www.nwu.edu.cn/home/index/articles/mid/3888.html">讲座报告</a>
</h2>
<span>
<a href="http://www.nwu.edu.cn/home/index/articles/mid/3888.html">更多 +</a>
</span>
</div>
{% block content %}
{% endblock %}
</div>
3.2 创建文件,用于继承base.html
template/content.html
<!-- 继承base.html -->
{% extends "base.html" %}
{% block title %}
新闻页 content修改
{% endblock %}
{% block content %}
<h1>新闻页 new_list,这里是调用西大base.html的页面,只是想换什么内容,通过block进行更换</h1>
{% endblock %}
template/new_list.html
<!-- 继承base.html -->
{% extends "base.html" %}
{% block title %}
新闻页 new_list
{% endblock %}
{% block content %}
<h1>新闻页 new_list,这里是调用西大base.html的页面,只是想换什么内容,通过block进行更换</h1>
{% endblock %}
3.3 后台调用数据
- views.py 建立调用html 的函数
from django.shortcuts import render_to_response
# Create your views here.
from .models import News
def news(request):
name = "admin"
return render_to_response("news.html", locals())
def base(request):
return render_to_response("base.html",locals())
def new_list(request):
news = News.objects.filter(delete_flag = "N").order_by("data")
return render_to_response("new_list.html", locals())
# url(r'^new_list/(\w+)', content), new_list.html的超链接调转到content, 同时传递参数src为超链接内容
def content(request, src):
new = News.objects.get(src = src)
return render_to_response("content.html", locals())
- urls.py 客户端请求时调用views.py的调用的html
from django.conf.urls import include, url
from django.contrib import admin
from News.views import *
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^news/$', news),
url(r'^base/$', base),
url(r'^new_list/$', new_list),
url(r'^content/$', content),
url(r'^new_list/(\w+)', content),
]
- new_list.html内容, 用于继承base.html, 同时修改block的内容,用于自己用
<!-- 继承base.html -->
{% extends "base.html" %}
{% block title %}
新闻页 new_list
{% endblock %}
{% block content %}
<h1>新闻页 new_list,这里是调用西大base.html的页面,只是想换什么内容,通过block进行更换</h1>
<div>
{% for new in news %}
<ul class="main-notice-list">
<li><span class="day">{{new.data}}</span></time><a href="{{new.src}}"><p>{{new.title}}</p></a></li>
</ul>
{% endfor %}
</div>
{% endblock %}
- content.html内容, 用于继承base.html, 同时修改block的内容,用于当new_list超链接时进行新数据的显示
<!-- 继承base.html -->
{% extends "base.html" %}
{% block title %}
{{new.title}}
{% endblock %}
{% block content %}
<h1>{{new.title}}</h1>
<p>{{new.content}}</p>
{% endblock %}
{% block news2 %}
<h1>空白等待更改</h1>
{% endblock %}
至此:
由Django调用mysql数据库进行html显示结束
四、admin页操作http://127.0.0.1:8000/admin/
4.1 对数据库的操作
admin.py
from django.contrib import admin
from .models import *
admin.site.register(News, ) # 安装模型
- 在下面每个项都可以增删改查, 每个项就是表中一个数据
4.2 修改admin页的显示项,美化
admin.py
from django.contrib import admin
from .models import *
# Register your models here.
class NewsAdmin(admin.ModelAdmin):
list_display = ["title", "author", "data"] # 注意这块跟model里面定义的key要保持一致
search_fields = ["author"] # 在/admin/页面添加搜索框,
list_filter = ["data"] # 添加过滤器
date_hierarchy = "data" # 添加时间
admin.site.register(News, NewsAdmin) # 安装模型
详细知识内容可以参考博客
Django学习
五、request
<!DOCTYPE html>
<html>
<head>
<title>news</title>
<meta charset="utf-8">
</head>
<body>
<h1>{{request}}</h1><br>
<p>{{request_list}}</p>
<ul>
<li>{{request.path}} <span>返回除了域名以外的其他路径</span></li>
<li>{{request.get_host}} <span>获取主机名称</span></li>
<li>{{request.get_full_path}} <span>获取请求路径,但是包含查询字符串</span></li>
<li>{{request.is_secure}} <span>判断是否是https协议</span></li>
<li>{{request.is_secure}} <span>判断是否是https协议</span></li>
<!-- <li>{{request.META}} <span>判断是否是https协议</span></li> -->
<li>{{request.META.HTTP_USER_AGENT}} <span>META 方法</span></li>
</ul>
<p>welcome to {{request.path}}</p>
</body>
</html>
- 说明:本节学习html的表单,以及如何将表单数据保存到数据库,
- 新建user表用于保存user和password
- 新建前端forms.html
- form组件包含
- Text 文本输入框
- password 密码输入框
- submit 按钮输入框
- form表单数据提交必须包含name属性
- action 表单数据提交的地址 method提交方式
- get是容易请求,以明文形式,而post使用非明文加密方
5.1 建表User, 修改models.py
from django.db import models
# Create your models here.
class News(models.Model):
title = models.CharField(max_length=32)
author = models.CharField(max_length=32)
data = models.DateField()
content= models.TextField()
src = models.CharField(max_length=64)
delete_flag = models.CharField(max_length=4)
class User(models.Model):
user = models.CharField(max_length=32)
password = models.CharField(max_length=32)
5.2 同步到数据库
5.3 新建forms.html
注意: 这里因为PST请求,Django含有验证措施,会出错,所以需要在settings.py中修改数据
MIDDLEWARE_CLASSES = (
# ‘django.middleware.csrf.CsrfViewMiddleware’, # fangzhi csrf跨域, 注释掉就好了,对于post请求的时候)
<!DOCTYPE html>
<html>
<head>
<title>forms</title>
<meta charset="utf-8">
</head>
<body>
<!-- action 表单数据提交的地址 method提交方式 -->
<form action="" method="POST">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="click">
</form>
</body>
</html>
5.4 修改views.py文件, 返回请求数据, hash加密
from django.shortcuts import render_to_response
import hashlib
from News.models import *
# Create your views here.
def forms(request):
if request.method == "POST" and request.POST: # 如果你请求的是post格式, 并有数据
username = request.POST["username"] # 前端里面的的name值
password = request.POST["password"]
hash = hashlib.md5()
hash.update(password.encode("UTF-8")) # 指定编码格式,否则会报错
password = hash.hexdigest()
u = User()
u.user = username
u.password = password
u.save() # 将得到的数据保存到table中
return render_to_response("forms.html", locals())
5.5 修改urls.py
from django.conf.urls import include, url
from django.contrib import admin
from News.views import *
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^forms/$', forms),
]
5.6 结果
6.1 新建News/forms.py,用于存放表单
当html进行服务器访问,将会根据views.py实例化表单
from django import forms
# 生成forms表单
class Register(forms.Form):
user = forms.CharField(max_length=32, label="用户名") # 默认显示user, 添加label显示label名
password = forms.CharField(max_length=32)
phone = forms.CharField(max_length=15)
def clean_password(self): # 函数明命名必须clean_字段名称
password = self.cleaned_data["password"] # 获取要判断的数据
if password[0].isdigit(): # 判断数字
raise forms.ValidationError("firs cann't be number")
return password
6.2 views.py调用表单forms
当html调用forms会实例化
# encoding=UTF-8
from django.shortcuts import render_to_response
import hashlib
from News.models import *
from News.forms import *
def django_forms(request):
if request.method == "POST" and request.POST:
register = Register(request.POST) # 将request数据提交到表单里面进行验证
if register.is_valid():
data = register.cleaned_data # 校验成功的数据以字典的形式返回
else: # 如果错误, 将会仅仅实例化表单,什么都不做
register = Register()
return render_to_response("django_forms.html", locals())
6.3 新建django_forms.html
<!DOCTYPE html>
<html>
<head>
<title>django_forms</title>
<meta charset="utf-8">
<style>
.errorlist{color: red}
</style>
</head>
<body>
<form action="" method="post">
{{register}}
<input type="submit" value="click">
<!-- {{register.as_p}}
{{register.as_ul}} -->
</form>
{{data}}
</body>
</html>
6.4 urls.py添加 略
- 结果
- 访问
http://127.0.0.1:8000/django_forms/
此时直接实例化类Register
- 直接点击
click
, 红色是.errorlist{color: red}
这是验证机制提示 - 这是密码输入部分根据
clean_password
验证错误提示 - 这是验证正确显示的结果:
data = register.cleaned_data # 校验成功的数据以字典的形式返回