<<写在前面:
本篇博客为鄙人学习python的django框架所做的笔记,因为第一次写这个东西,所以有很多地方需要注意的,所以在这里把所有需要自己修改设置的地方都写出来了,作为自己的学习经历,也希望能给大家一点提示。里面包含了一些基本操作,注释的部分为另一种操作或方法。#^_^#
注:绿色部分为工程下的文件名,浅蓝色的为该文件中需要增加或修改的部分代码,没列出来的目前应该是初级阶段不用修改的了
__init__.py:
import pymysql
pymysql.install_as_MySQLdb()
setting.py:
INSTALLED_APPS = [...] #这里加上你的应用名
DATABASES = { #根据需要修改所用的数据库
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'webdb',
'USER': 'root',
'PASSWORD': '123456',
'HOST': 'localhost',
'PORT': '3306',
}
}
TEMPLATES = [ #视图对应的模板,需先在工程文件夹下建立templates文件夹(存放.html文件)
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
LANGUAGE_CODE = 'zh-Hans' #所用文字编码
STATIC_URL = '/static/' #在工程下建立static文件夹后加上这两句话
STATICFILES_DIRS = (BASE_DIR,'static')
urls.py:
from django.conf.urls import url,include
from django.contrib import admin
from index import views as v
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$',v.index_views),
]
urlpatterns +=[
url(r'^login/',v.login_views),
]
urlpatterns +=[
url(r'^register/',v.register_views),
]
urlpatterns +=[
url(r'^01_author_add/$',v.author_add_views),
url(r'^02_query/$',v.query_views),
url(r'^03_update/(\d+)$',v.update_views,name='update'),
url(r'^04_del/(\d+)/$',v.del_views,name='del'),#(\d+)表示传一个参数,'del'表示视图别名
]
urlpatterns +=[
url(r'^06_oto/$',v.oto_views),
url(r'^07_request',v.request_views),
]
admin.py: #后台管理
# -*- coding: UTF-8 -*-
from django.contrib import admin
from .models import *
# Register your models here.
#admin.site.register(Author)
class AuthorAdmin(admin.ModelAdmin):list_display = ['name','age','email']#指定显示在实体信息页面上的信息
list_display_links = ['name','email']#链接到详细页面
list_editable = ['age']#设置display中可修改的属性,但不能修改上面link中的属性对应的值
search_fields = ['name','email']#指定允许被搜索的字段
list_filter = ['age']
#fields = ('email','name','age')#分块显示
fieldsets = (
('基本设置',{
'fields':('name','age')
}),
('高级设置',{
'fields':('email',),
#折叠效果
'classes':('collapse',)
}),
)
admin.site.register(Author,AuthorAdmin)
class PublisherAdmin(admin.ModelAdmin):
list_display = ['name','address','city']
list_editable = ['address','city']
search_fields = ['address','city']
fieldsets = (
('基本设置',{
'fields':('name','address','city')
}),
('高级设置',{
'fields':('country','website'),
#折叠效果
'classes':('collapse',)
}),
)
admin.site.register(Publisher,PublisherAdmin)
class WifeAdmin(admin.ModelAdmin):
list_display = ['name','age','author']
admin.site.register(Wife,WifeAdmin)
models.py:
# -*- coding: UTF-8 -*-
from django.db import models
# Create your models here.
class Publisher(models.Model):name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=30)
country = models.CharField(max_length=30)
website = models.URLField()
def __str__(self):
return self.name
class Meta:#内部类
#db_table = 'author'#修改表名
verbose_name = '推送者'#定义类在admin中的显示
verbose_name_plural = verbose_name
class Author(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
email = models.EmailField()
def __str__(self):
return self.name
class Meta:#内部类
#db_table = 'author'#修改表名
verbose_name = '作者'#定义类在admin中的显示
verbose_name_plural = verbose_name
ordering = ["-age"]#按年龄降序排序
class Book(models.Model):
title = models.CharField(max_length=50)
publication_date = models.DateField()
class Models(models.Model):
isActiveUser = models.BooleanField()
class Wife(models.Model):name = models.CharField(max_length=30)
age = models.IntegerField()
author = models.OneToOneField(Author,null=True)
def __str__(self):
return self.name
class Meta:
db_table = "wife"
verbose_name = '老婆'
verbose_name_plural = verbose_name
class Good(models.Model):title = models.CharField(max_length=30,verbose_name='商品名称')
price = models.DecimalField(max_digits=7,decimal_places=2,verbose_name='商品价格')
spec = models.CharField(max_length=30,verbose_name='商品规格')
picture = models.ImageField(upload_to='static/upload/goods',verbose_name='商品图片')
isActive = models.BooleanField(default=True,verbose_name='在售')
class GoodsType(models.Model):title = models.CharField(max_length=30,verbose_name='类别名称')
desc = models.TextField(null=True,verbose_name='类别描述')
picture = models.ImageField(upload_to='static/upload/goodsType',verbose_name='类别图片')
views.py:
# -*- coding: UTF-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from .models import *
from django.db.models import F,Q
# Create your views here.
def index_views(request):#request.scheme请求协议
#request.body请求主体
#request.path请求路径
#request.get_host()请求主机/域名
#request.method请求方式
#request.GET封装了GET方式的请求数据
#request.POST
#request.COOKIES
#request.META
return HttpResponse('main')
def login_views(request):if request.method=='GET':
return render(request,'login.html')
else:
uphone = request.POST.get('uphone')
upwd = request.POST.get('upwd')
return HttpResponse(uphone+':'+upwd)
def register_views(request):
return render(request,'register.html')
def author_add_views(request):
#way1
Author.objects.create(name='zzg',age=21,email='[email protected]')
Author.objects.create(name='hhh',age=32,email='[email protected]')
return HttpResponse("增加数据成功")
def query_views(request):listAuthor = Author.objects.all()
#listAuthor = Author.objects.values('name','age') #查询这两个字段的数据集
#listAuthor = Author.objects.all().order_by('-id') #降序排返回数据集
#listAuthor = Author.objects.exclude(id=2) #查寻id != 2的数据集
#listAuthor = Author.objects.filter(id=2) #查询id == 2的数据集
#Author = Author.objects.get(id=2) #查询id == 2的单条数据print(Author.name)
#listAuthor = Author.objects.filter(age__gt=33) #查询age>33 的数据集,__gte表示大于等于
#listAuthor = Author.objects.filter(name__contains='宝') #查询name属性中包含'宝'字的数据集
#listAuthor = Author.objects.filter(name__startwith='张')#查询name属性中以'张'字开头的数据集
#listAuthor = Author.objects.filter(name__endwith='丰')
#listAuthor = Author.objects.filter(Q(id=1) | Q(age=31)) #查询id为1或者age为31的数据集
return render(request,'02_query.html',locals()) #locals把函数中所有变量传入.html中
def update_views(request,id):if request.method == 'GET':
author = Author.objects.get(id=id)
return render(request,'update.html',locals())
else:
author = Author.objects.get(id=id)
print(author)
author.name = request.POST.get('name')
author.age = request.POST.get('age')
author.email = request.POST.get('email')
author.save()
return HttpResponseRedirect('/02_query')
#单个修改
#author = Author.objects.get(id=id)
#author.name = '张三'
#author.age = 56
#author.save()
#批量修改
#Author.objects.filter(age__gt=50).update(age=60)
#Author.objects.all().update(age = F('age')+10)#F获取某列的值
return query_views(request)
def del_views(request,id):#删除操作,id为传入参数Author.objects.get(id=id).delete()
return query_views(request) #视图转发
#return HttpResponseRedirect('/02_query')#视图重定向
def oto_views(request):
#正向查询
# title = "通过wife找author"
# w = Wife.objects.get(id=1)
# a = w.author
#反向查询
title = "通过author找wife"
a = Author.objects.get(id=11)
w = a.wife
return render(request,'oto.html',locals())
def request_views(request):
#print(dir(request))
scheme = request.scheme
body = request.body
path = request.path
method = request.method
host = request.get_host()
get = request.GET
post = request.POST
cookies = request.COOKIES
meta = request.META
return render(request,'request.html',locals())
02_query.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Table</title>
</head>
<body>
<table>
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>邮箱</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{%for au in listAuthor%}
<tr>
<td>{{au.id}}</td>
<td>{{au.name}}</td>
<td>{{au.age}}</td>
<td>{{au.email}}</td>
<td>
<a href="{%url 'del' au.id%}">删除</a>
<a href="{%url 'update' au.id%}">修改</a>
</td>
</tr>
{%endfor%}
</tbody>
</table>
</body>
login.html:
{%load static%}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>会员登录</title>
<!-- <link rel="stylesheet" href="/static/css/login.css"> -->
<link rel="stylesheet" href="{%static 'css/login.css'%}">
</head>
<body>
<div id="container">
<h2 class="title">会员登录</h2>
<!-- 下 左 :图片 -->
<p>
<img src="/static/images/huiyuan.jpg">
<a href="http://127.0.0.1:8000/register/">会员注册></a>
</p>
<!-- 下 右 :登录form -->
<div id="login">
<form action="login" method="post">
<!--解决post的跨站点攻击403-->
{%csrf_token%}
<!-- 第一行:手机号 -->
<div class="form-line">
<p>手机号</p>
<div>
<input type="text" name="uphone" class="form-control">
</div>
</div>
<!-- 第二行:密码 -->
<div class="form-line">
<p>密码</p>
<div>
<input type="password" name="upwd" class="form-control">
</div>
</div>
<!-- 第三行:记住密码 -->
<div class="form-line">
<p></p>
<div>
<p>
<a href="#">忘记密码</a>
<a href="#">快捷登录</a>
</p>
<input type="checkbox" name="isSaved" class="isSaved" id="isSaved">
<label for="isSaved">记住密码</label>
</div>
</div>
<!-- 第四行:登录 & 注册会员 -->
<div class="form-line">
<p></p>
<div>
<a href="http://127.0.0.1:8000/register/" class="register">注册会员</a>
<input type="submit" value="登录" class="btnLogin">
</div>
</div>
</form>
</div>
</div>
</body>
</html>
request.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Table</title>
</head>
<body>
<div style="color:purple">
<h2 align="center">{{title}}</h2>
<h3 align="center">scheme:{{scheme}}</h3>
<p align="center"> body:{{body}}</p>
<p align="center"> path:{{path}}<p>
<p align="center"> method:{{method}}</p>
<p align="center"> host:{{host}}</p>
<p align="center"> get:{{get}}</p>
<p align="center"> post:{{post}}</p>
<p align="center"> cookies:{{cookies}}</p>
<p align="center"> meta:{{meta}}</p>
</div>
</body>
</html>
update.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Table</title>
</head>
<body>
<form action="{% url 'update' author.id %}" method='post'>
{%csrf_token%}
NAME<input type='text' name='name' value="{{author.name}}">
AGE<input type='text' name='age' value="{{author.age}}">
EMAIL<input type='text' name='email' value="{{author.email}}">
<input type='submit' value='update'>
</form>
</body>
</html>