app01/models.py
from django.db import models
# Create your models here.
class Book(models.Model):
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=6,decimal_places=2)
create_time=models.DateField()
memo=models.CharField(max_length=32,default="")
# book_obj.publish: 与这本书籍关联的出版社对象
publish=models.ForeignKey(to="Publish",default=1)
# book_obj.author.all(): 与这本书关联的作者对象集合,Queryset []
authors=models.ManyToManyField("Author") # 自动创建第三张表
def __str__(self):
return self.title
class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.CharField(max_length=32)
class Author(models.Model):
name=models.CharField(max_length=32)
def __str__(self):return self.name
# class Author2Book(models.Model):
# book=models.ForeignKey("Book")
# author=models.ForeignKey("Author")
[projectname]/urls.py
"""cms_s20 URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url,include
from django.contrib import admin
from django.shortcuts import HttpResponse
from app01.views import *
urlpatterns = [
url(r'^admin/', admin.site.urls),
# url(r'^timer/$', timer), # timer(request)
# url(r'^books_achrive/(d+)/$', book_detail), # book_detail(request,3)
# #url(r'^books_achrive/(d+)/(d+)/$', books_achrive), # books_achrive(request,2012,12)
# url(r'^books_achrive/(?P<year>d+)/(?P<month>d+)/$', books_achrive2), # books_achrive(request,year=2012,month=12)
url(r'^login/', login,name="xxx"),
url(r'^app01/', include('app01.urls'),),
url(r'^template/', temp_func,),
url(r'^add/', add,),
url(r'^query/', query,),
url(r'^books/', books,),
url(r'^$', books,),
url(r'^addbook/', addbook,name='add_book'),
url(r'^edit/(d+)', editbook,name='edit_book'),
url(r'^del/(d+)', delbook,name='del_book'),
]
# url的路径:/books/3与正则匹配 /book/d+
# import re
#
# re.findall("^books_achrive/(d+)/$","books_achrive/2012/12/")
app01/views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def timer(request):
import time
ctime=time.time()
#return HttpResponse(ctime)
return render(request,"timer.html",{"ctime":ctime})
def book_detail(reqeust,id):
return HttpResponse(id)
def books_achrive(request,year,month):
return HttpResponse(year+":"+month)
def books_achrive2(request,month,year):
return HttpResponse(year+":"+month)
def login(request):
if request.method=="GET":
print(request.GET)
print(request.POST)
print(request.method)
print(request.path)
print(request.path_info)
print(request.body)
return render(request, "login.html")
else:
print(request.GET)
print(request.POST)
print(request.method)
print(request.path)
print(request.path_info)
print(request.body)
user=request.POST.get("user")
pwd=request.POST.get("pwd")
if 1:
return redirect("/app01/timer/")
def temp_func(request):
l=[11,222,333]
dic={"name":"yuan","age":23}
class Person(object):
def __init__(self,name,age):
self.name=name
self.age=age
def learning(self):
return "learning"
alex=Person("alex",45)
egon=Person("egon",36)
person_list=[alex,egon]
import datetime
now=datetime.datetime.now()
print(now)
file_size=234212123123
content="hello yuan world egon alex"
s="<a href='http://www.baidu.com'>hello</a>"
#return render(request,"temp.html",{"l":l,"dic":dic})
return render(request,"temp.html",locals())
from .models import *
def add(request):
# obj=Book.objects.create(title="python",price=123,create_time="2012-12-12")
# print(obj.title)
obj=Book(title="php",price=123,create_time="2012-12-12")
obj.save()
return HttpResponse("123")
def query(request):
# # (1) all() QuerySet: [<Book: Book object>, <Book: Book object>]
# book_list=Book.objects.all()
# print(book_list)
#
# # (2) filter() QuerySet
# book_list=Book.objects.filter(price=123,title="python")
# print(book_list)
# book = Book.objects.filter(price=123, title="python")[0]
# print(book) # model对象
#
# # (3) get() model对象 有且只有一个查询结果才有意义
# book=Book.objects.get(price=12345)
# print(book)
#(4) order_by QuerySet
# book_list=Book.objects.all().order_by("-id")
# book_list=Book.objects.all().order_by("price")
# print(book_list)
# # (5) count
# c = Book.objects.all().order_by("price").count()
# print(c)
# # (6)first() model对象
# book=Book.objects.all().first()
#
# # (7)exists()
# ret=Book.objects.all().exists()
# if ret:
# print("Ok")
# (8)values:QuerySet
# ret=Book.objects.all().values("title","price")
# print(ret) # <QuerySet [{'title': 'python'}, {'title': 'php'}]>
# ret=Book.objects.all().values_list("title","price")
# print(ret)# <QuerySet [('python', Decimal('123.00')), ('php', Decimal('122.00'))]>
# (9)distinct
# ret=Book.objects.all().values("price").distinct()
# print(ret)
#######################模糊查询#############################
book_list=Book.objects.filter(title__startswith="py")
book_list=Book.objects.filter(price__gt=120)
return HttpResponse("OK")
'''
temp=[]
for obj in Book.objects.all():
temp.append({
"title":obj.title
"price":obj.price
})
'''
def books(reqeust):
book_list=Book.objects.all()
# 一对多查询
# book_obj=Book.objects.filter(id=6).first()
# print(book_obj.publish.name)
# print(book_obj.publish.email)
# 多对多的查询
# book_obj = Book.objects.filter(id=6).first()
# print(book_obj.author.all())
return render(reqeust,"books.html",locals())
def addbook(request):
if request.method=="POST":
title=request.POST.get("title")
price=request.POST.get("price")
date=request.POST.get("date")
publish_id=request.POST.get("publish_id")
author_id_list=request.POST.getlist("author_id_list")
print("author_id_list",author_id_list)
# 绑定书籍与出版社的一对多的关系
obj=Book.objects.create(title=title,price=price,create_time=date,publish_id=publish_id)
# 绑定书籍与作者的多对多的关系
# 不可行方案
# for author_id in author_id_list:
# A.objects.create(book_id=obj.pk,author_id=author_id)
# 可行方案
# obj.author.add(1,2,3)
# obj.author.remove(1,2)
# obj.author.clear()
obj.authors.add(*author_id_list)
return redirect("/books/")
else:
publish_list=Publish.objects.all()
author_list=Author.objects.all()
return render(request,"addbook.html",locals())
def editbook(request,id):
if request.method == "POST":
title=request.POST.get("title")
price=request.POST.get("price")
date=request.POST.get("date")
publish_id=request.POST.get("publish_id")
author_id_list=request.POST.getlist("author_id_list")
# QuerySet才能update
Book.objects.filter(id=id).update(title=title,price=price,create_time=date,publish_id=publish_id)
# 先清空与多值的关系,再添加多对多的关系
Book.objects.get(id=id).authors.clear()
Book.objects.get(id=id).authors.add(*author_id_list)
# 等同于 book.authors.set(author_id_list)
return redirect("/books/")
publish_list = Publish.objects.all()
author_list = Author.objects.all()
edit_book=Book.objects.get(id=id)
return render(request,"editbook.html",locals())
def delbook(request,id):
Book.objects.filter(id=id).delete()
return redirect("/books/")
templates/books.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>书籍展示页</title>
<style>
.container{
margin-top: 100px;
}
</style>
<link rel="stylesheet" href="/static/bs/css/bootstrap.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<a href="{% url 'add_book'%}"><button class="btn btn-primary">添加数据</button></a>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>序号</th>
<th>书名</th>
<th>价格</th>
<th>出版时间</th>
<th>出版社</th>
<th>作者</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for book in book_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ book.title }}</td>
<td>{{ book.price }}</td>
<td>{{ book.create_time|date:"Y-m-d" }}</td>
<td>{{ book.publish.name }}</td>
<td>
{% for author in book.authors.all %}
{{ author.name }}
{% if not forloop.last %}
,
{% endif %}
{% endfor %}
</td>
<td>
<a href="{% url 'edit_book' book.pk %}">编辑</a>
<a href="{% url 'del_book' book.pk %}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
templates/editbook.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>编辑书籍</title>
<style>
.container{
margin-top: 100px;
}
</style>
<link rel="stylesheet" href="/static/bs/css/bootstrap.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="{% url 'edit_book' id%}" method="post">
{% csrf_token %}
<p>书籍名称 <input type="text" name="title" value="{{ edit_book.title }}"></p>
<p>书籍价格 <input type="text" name="price" value="{{ edit_book.price }}"></p>
<p>出版日期 <input type="date" name="date" value="{{ edit_book.create_time|date:"Y-m-d" }}"></p>
<p>出版社 <select name="publish_id" id="">
{% for publish in publish_list %}
{% if edit_book.publish == publish %}
<option selected value="{{ publish.id }}">{{ publish.name }}</option>
{% else %}
<option value="{{ publish.id }}">{{ publish.name }}</option>
{% endif %}
{% endfor %}
</select>
</p>
<p>作者<select name="author_id_list" id="" multiple >
{% for author in author_list %}
{% if author in edit_book.authors.all %}
<option selected value="{{ author.id }}">{{ author.name }}</option>
{% else %}
<option value="{{ author.id }}">{{ author.name }}</option>
{% endif %}
{% endfor %}
</select>
</p>
<input type="submit" class="btn btn-default">
</form>
</div>
</div>
</div>
</body>
</html>
templates/addbook.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>新增书籍</title>
<style>
.container{
margin-top: 100px;
}
</style>
<link rel="stylesheet" href="/static/bs/css/bootstrap.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<form action="{% url 'add_book'%}" method="post">
{% csrf_token %}
<p>书籍名称 <input type="text" name="title"></p>
<p>书籍价格 <input type="text" name="price"></p>
<p>出版日期 <input type="date" name="date"></p>
<p>出版社 <select name="publish_id" id="">
{% for publish in publish_list %}
<option value="{{ publish.pk }}">{{ publish.name }}</option>
{% endfor %}
</select>
</p>
<p>作者 <select name="author_id_list" id="" multiple>
{% for author in author_list %}
<option value="{{ author.pk }}">{{ author.name }}</option>
{% endfor %}
</select>
</p>
<input type="submit" class="btn btn-default">
</form>
</div>
</div>
</div>
</body>
</html>