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),

]
urls.py
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))
views.py
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')  # 多对多表关系
models.py
"""
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')
]
settings.py

 

posted @ 2018-08-05 23:59  Mr.GLH  阅读(191)  评论(0)    收藏  举报
Top↑