Django--图书管理系统

"""Publish_house 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 from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^delete_(publisher|book|author)/(\d+)', views.delete), url(r'^publisher/', views.publisher_list, name="publisher"), url(r'^add_publisher/', views.add_publisher), # url(r'^delete_publisher/', views.delete_publisher), # url(r'^delete_publisher/(?P<del_id>\d+)', views.delete_publisher), url(r'^edit_publisher/', views.edit_publisher), url(r'^book_list/', views.book_list, name="book"), url(r'^add_book/', views.add_book), # url(r'^delete_book/', views.delete_book), url(r'^edit_book/', views.edit_book), url(r'^author_list/', views.author_list, name="author"), url(r'^add_author/', views.add_author), # url(r'^delete_author/', views.delete_author), url(r'^edit_author/', views.edit_author), ]

from django.shortcuts import render, redirect, HttpResponse, reverse from app01 import models # Create your views here. def publisher_list(request): publishers = models.Publisher.objects.all().order_by('id') return render(request, 'publisher/publisher.html', {"publishers": publishers}) def add_publisher(request): new_name = "" err_msg = "" if request.method == "POST": new_name = request.POST.get("publisher_name") if new_name: publisher_obj_lst = models.Publisher.objects.filter(name=new_name) if not publisher_obj_lst: models.Publisher.objects.create(name=new_name) return redirect("/publisher/") else: err_msg = "该出版社名称已存在,请重新选择!" else: err_msg = "出版社名称不能为空!" return render(request, "publisher/add_publisher.html", {"old_name": new_name, "err_msg": err_msg}) # 采用get请求获取 自己在url上拼接的参数 # def delete_publisher(request): # del_id = request.GET.get("id") # if del_id: # del_id_obj_lst = models.Publisher.objects.filter(id=del_id) # if del_id_obj_lst: # del_id_obj_lst.delete() # 直接删除 # return redirect("/publisher/") # else: # return HttpResponse("删除错误!") # else: # return HttpResponse("id不能为空!") # 采用url分组传参的方式获取参数 def delete_publisher(request, del_id): if del_id: del_id_obj_lst = models.Publisher.objects.filter(id=del_id) if del_id_obj_lst: del_id_obj_lst.delete() # 直接删除 return redirect("/publisher/") else: return HttpResponse("删除错误!") else: return HttpResponse("id不能为空!") def edit_publisher(request): err_msg = '' edit_id = request.GET.get("id") if edit_id: edit_id_obj_lst = models.Publisher.objects.filter(id=edit_id) if edit_id_obj_lst: edit_id_obj = edit_id_obj_lst[0] old_name = edit_id_obj.name if request.method == 'POST': new_name = request.POST.get("publisher_name") edit_new_name_obj_lst = models.Publisher.objects.filter(name=new_name) if new_name and not edit_new_name_obj_lst: edit_id_obj.name = new_name edit_id_obj.save() return redirect("/publisher/") elif not new_name: err_msg = "出版社名称不能为空 !" elif edit_new_name_obj_lst: err_msg = "出版社名称已存在,请重新选择!" return render(request, "publisher/edit_publisher.html", {"old_name": old_name, "err_msg": err_msg}) else: return HttpResponse("编辑id错误") else: return HttpResponse("编辑id为空!") def book_list(request): book_obj_lst = models.Book.objects.all() # print(book_obj_lst) # for book in book_obj_lst: # print(book) # print(book.publisher) # 拿到publisher对象 # print(book.publisher.id) # print(book.publisher.name) # print("="*60) return render(request, 'book/book_list.html', {"book_obj_lst": book_obj_lst}) def add_book(request): err_msg = '' add_book_name = '' publisher_lst = models.Publisher.objects.all() if request.method == 'POST': add_book_name = request.POST.get('book_name') if add_book_name: book_is_exist = models.Book.objects.filter(title=add_book_name) if not book_is_exist: get_publisher_id = request.POST.get('publisher') # 方式1 # get_publisher_obj = models.Publisher.objects.get(id=get_publisher_id) # models.Book.objects.create(title=add_book_name, publisher=get_publisher_obj) # 方式2 models.Book.objects.create(title=add_book_name, publisher_id=get_publisher_id) return redirect("/book_list/") else: err_msg = "要添加的图书已存在!" else: err_msg = "名称不能为空!" return render(request, 'book/add_book.html', {"publisher_lst": publisher_lst, "err_msg": err_msg, "old_name": add_book_name}) def delete_book(request): del_book_id = request.GET.get("id") if del_book_id: del_id_is_exist_obj = models.Book.objects.filter(id=del_book_id) if del_id_is_exist_obj: # 方式1 del_id_is_exist_obj.delete() # 方式2 # del_book = del_id_is_exist_obj[0] # del_book.delete() return redirect("/book_list/") def edit_book(request): err_msg = '' publisher_lst = models.Publisher.objects.all() edit_book_id = request.GET.get("id") if edit_book_id: edit_book_obj = models.Book.objects.filter(id=edit_book_id) if edit_book_obj: old_edit_obj = edit_book_obj[0] old_edit_name = old_edit_obj.title if request.method == "POST": new_book_name = request.POST.get("book_name") if new_book_name: get_edit_publisher_id = request.POST.get("publisher") old_edit_obj.title = new_book_name old_edit_obj.publisher_id = get_edit_publisher_id old_edit_obj.save() return redirect("/book_list/") else: err_msg = "图书名称不能为空!" return render(request, 'book/edit_book.html', {"publisher_lst": publisher_lst, "err_msg": err_msg, "old_name": old_edit_name, "edit_book": old_edit_obj}) return redirect("/book_list/") def author_list(request): authors = models.Author.objects.all().order_by('id') # print(authors) # 拿到所有authors的对象 # for author in authors: # print(author.name) # print(author.books) # 拿到所有books的所有 django 产生的books many... 对象 # print(author.books.all()) # 拿到所有books的所有我们想要的对象 return render(request, "author_list.html", {"authors": authors}) def add_author(request): err_msg = "" new_author = "" books = models.Book.objects.all().order_by("id") if request.method == "POST": new_author = request.POST.get('author_name') if new_author: get_new_author_obj = models.Author.objects.filter(name=new_author) if not get_new_author_obj: # book_id_obj_lst1 = request.POST.get('book') # print(book_id_obj_lst1) # 只获取到最后一个 book_id_lst = request.POST.getlist('book') # print(book_id_obj_lst) # 获取所有的 得到一个列表 ['1', '2', '3', '5'] new_author_obj = models.Author.objects.create(name=new_author) new_author_obj.books.set(book_id_lst) return redirect("/author_list/") else: err_msg = "该作者已存在,请重新填写!" else: err_msg = "作者名字不能为空!" return render(request, "add_author.html", {"books": books, "err_msg": err_msg, "new_author": new_author}) def delete_author(request): del_author_id = request.GET.get("id") if del_author_id: get_author_obj_lst = models.Author.objects.filter(id=del_author_id) if get_author_obj_lst: # 2种方式均可删除author,也可删除多对多的关系,但是不会删除书籍 # 方式1,直接删除对象 # get_author_obj_lst.delete() # 方式2,删除具体的author del_author = get_author_obj_lst[0] del_author.delete() return redirect('/author_list/') def edit_author(request): err_msg = "" books = models.Book.objects.all() edit_id = request.GET.get("id") if edit_id: author_id_obj_lst = models.Author.objects.filter(id=edit_id) if author_id_obj_lst: old_author_obj = author_id_obj_lst[0] if request.method == "POST": new_author_name = request.POST.get("author_name") if new_author_name: # 不用管是否已存在,此时是允许修改名字的,但是上面要判断名字不为空 old_author_obj.name = new_author_name old_author_obj.save() new_books_obj = request.POST.getlist("book") old_author_obj.books.set(new_books_obj) return redirect("/author_list/") # get_new_author_obj_lst = models.Author.objects.filter(name=new_author_name) # # # 如果能查到,说明时修改book # if get_new_author_obj_lst: # new_author_obj = get_new_author_obj_lst[0] # new_author_obj.name = new_author_name # new_author_obj.save() # # # 直接设置 对应关系,不用save() # # new_author_obj.books.set(new_books_obj) # return redirect("/author_list/") # # 如果不能查到,说明是修改author的name # else: # old_author_obj.name = new_author_name # old_author_obj.books.set(new_books_obj) # return redirect("/author_list/") else: err_msg = "作者名字不能为空!" return render(request, "edit_author.html", {"books": books, "err_msg": err_msg, "old_author": old_author_obj}) return redirect("/author_list/") def delete(request, table, del_id): # 将三个删除操作放在同一个视图中 print(table) table_class = getattr(models, table.title()) print(table_class) table_class.objects.get(id=del_id).delete() return redirect(reverse(table))

from django.db import models # Create your models here. class Publisher(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32, null=False, unique=True) addr = models.CharField(max_length=108, null=False) class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32, null=False, unique=True) publisher = models.ForeignKey(to="Publisher", on_delete=models.CASCADE) # 多对一或者一对多关系 class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32, null=False, unique=True) books = models.ManyToManyField(to='Book') # 多对多表关系

""" Django settings for Publish_house project. Generated by 'django-admin startproject' using Django 1.11.14. For more information on this file, see https://docs.djangoproject.com/en/1.11/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.11/ref/settings/ """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'j+y&qdixqmt819+6!$a8%7+ffpy&a=w%)9g7bne^y1*4ij08_x' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config' ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'Publish_house.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'templates', 'author'), os.path.join(BASE_DIR, 'templates', 'book'), os.path.join(BASE_DIR, 'templates', 'publisher'), os.path.join(BASE_DIR, 'templates', 'public'), ], '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', ], }, }, ] WSGI_APPLICATION = 'Publish_house.wsgi.application' # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'publish', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '' } } # Password validation # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/1.11/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ]
学无止境!