Django 图书-英雄

python 专栏收录该内容
39 篇文章 0 订阅

环境创建

创建虚拟环境:
conda create -n django python==3.6
进入环境:
source activate django
安装Django:
pip install Django ==1.10
创建Django工程:
在这里插入图片描述
数据库迁移(文件数据库):
python manage.py makemigrations
python manage.py migrate
运行Django项目:(默认端口是8000)
python manage.py runserver
若修改端口直接在其后加端口即可
python manage.py runserver 9000
在这里插入图片描述
环境优化(语言及时区):
在settings.py里边修改:
LANGUAGE_CODE = ‘zh-hans’
TIME_ZONE = ‘Asia/Shanghai’
在这里插入图片描述
创建一给超级用户:
python manage.py createsuperuser
进入后台管理系统:
在这里插入图片描述

创建第一个app:book

创建app:
python manage.py startapp book
在这里插入图片描述
创建数据库表:
models.py

from django.db import models

# Create your models here.
#  关联关系:   书籍:人物====> 1:n
# 书籍
class BookInfo(models.Model):
    # id如果没有指定, 默认会添加id并作为主键(primary_key(pk))
    btitle = models.CharField(max_length=50, unique=True, verbose_name="图书名称") # 图书名称, 并限定最大长度为50;
    bpub_date = models.DateField(verbose_name="出版日期")
    # 添加书籍的详解
    bcontent = models.TextField(default="书籍摘要")
    # 添加图片, 并指定上传图片存放位置;   # hello.jpg   ====  static/uploads/hello.jpg
    bimg = models.ImageField(default=None, upload_to='static/uploads/')
    class Meta:
        # 后台的单数显示
        verbose_name = "图书信息"
        # 后台的复数显示, 如果不指定, 在单数后面默认加s;
        verbose_name_plural =  "图书信息"

    def __str__(self):
        return  "%s" %(self.btitle)


# 书籍中的英雄人物
class HeroInfo(models.Model):
    hname = models.CharField(max_length=50, verbose_name="人物名称")
    hgender = models.BooleanField(verbose_name="性别")
    hcontent = models.TextField(verbose_name="人物介绍")  # 人物介绍
    # 多的一端写外键
    hbook = models.ForeignKey(BookInfo, verbose_name="所属书籍")

    @property
    def gender(self):
        if self.hgender:
            return  "男"
        else:
            return  "女"
    class Meta:
        verbose_name = "人物信息"
        verbose_name_plural  = "人物信息"

    def __str__(self):
        return  "%s" %(self.hname)

激活模型:
settings.py文件:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book'
]

数据库迁移到本机的mysql数据库中:
settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
         # 数据库名称;
        'NAME': 'DjangoProject',
        'USER': 'cooffee',
        'PASSWORD': 'cooffee',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

在主项目的__init__.py文件中:
因为该版本的Django识别的是MySQLdb,而我门用的是python3,所以要把pymsql伪装为MySQLdb

import  pymysql
pymysql.install_as_MySQLdb()

进行数据库迁移
python manage.py makemigrations
python manage.py migrate

mysql数据库信息检测:
在这里插入图片描述
若没有使用本机mysql数据库,那么根据原来settings.py内容:

 DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
     }
 }

可知道数据迁移到文件数据库db.sqlite3中。
进行数据检测:
进入python shell
python manage.py shell
在这里插入图片描述
可对数据进行增删改查:
表明数据库迁移到db.sqlite3成功
在这里插入图片描述
新建图书信息:
在这里插入图片描述
查询及输出图书信息:
在这里插入图片描述
修改图书信息:

b.btitle=u"天龙八部"
b.save()

删除图书信息:

b.delete()

关联对象的操作:
添加关联对象:
在这里插入图片描述
获得关联集合:
在这里插入图片描述
添加关联对象的另一个操作:
在这里插入图片描述

后台管理:

在book/admin.py:

from django.contrib import admin

# Register your models here.
from book.models import BookInfo, HeroInfo

#关联注册
# 在书籍添加表单中增加行内表单(添加人物)
class HeroInline(admin.TabularInline):
    model = HeroInfo
    extra = 3


class BookInfoAdmin(admin.ModelAdmin):
    #显示字段
    list_display = ['btitle', 'bpub_date']
    inlines =  [HeroInline]

class HeroInfoAdmin(admin.ModelAdmin):
    # 显示字段
    list_display = ['hname', 'hcontent', 'hbook', 'gender']
    #过滤字段,过滤框会出现在右侧
    list_filter =  ['hname']
    #搜索字段,搜索框会出现在上侧
    search_fields = ['hname', 'hcontent']
    #分页,分页框会出现在下侧
    list_per_page = 2

#注册模型
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(HeroInfo, HeroInfoAdmin)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

URL设置

djangoproject/urls.py

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #r后的为正则表达式,匹配到之后去找book.urls的内容
    url(r'^$', include('book.urls')),
    url(r'book/', include('book.urls')),
]

book/urls.py:

from django.conf.urls import url
from book import views
#命名空间
app_name = 'book'
urlpatterns = [
    url(r'^$', views.index),
    url(r'^(?P<id>\d+)/$', views.detail)
]

视图函数

bool/views.py:

from django.shortcuts import render

# Create your views here.
from book.models import BookInfo

# 在flask里面, 默认请求是request
# Django里面的请求对象必须作为参数接收
def index(request):
    books = BookInfo.objects.all()
    return render(request,'blog/index.html',context={'books':books})

def detail(request,id):
    # 1). 查询指定id对应的书籍对象
    book = BookInfo.objects.get(id=id)
    # 2). 根据数据关联关系, 获取该书籍中包含的所有人物信息
    heros = book.heroinfo_set.all()
    return render(request,'blog/detail.html',
                  context={
                      'book':book,
                      'heros':heros
                  })

html:

在这里插入图片描述

在settings.py中设置:

为了找到static的设置,static存css,js等样式。当前项目的static文件夹
在这里插入图片描述
为了找到html存放的位置,设置为os.path.join(BASE_DIR, ‘templates’)当前项目的templates文件夹
在这里插入图片描述

各个html的内容:

base.html:

<!DOCTYPE HTML>
<html>
	<head>
		<title>{% block title %} {% endblock %}</title>
		<link href="/static/css/style.css" rel="stylesheet" type="text/css"  media="all" />
	</head>
	<body>
		<!---start-wrap--->
		<div class="wrap">
			<!---start-header--->
			<div class="header">
				<!---start-logo--->
				<div class="logo">
					<a href="index.html"><img src="/static/images/logo.png" title="logo" /></a>
				</div>
				<!---End-logo--->
				<!---start-head-social-icons--->
				<div class="top-social-icons">
					<div class="social-icons">
						<ul>
							<li><a href="#"><img src="/static/images/facebook1.png" title="facebook" /></a></li>
							<li><a href="#"><img src="/static/images/twitter1.png" title="Twitter" /></a></li>
							<li><a href="#"><img src="/static/images/youtube1.png" title="Youtube" /></a></li>
						</ul>
					</div>
					<div class="clear"> </div>
				</div>
				<div class="clear"> </div>
				<!---End-head-social-icons--->
				<!---start-top-nav---->
				<div class="top-nav">
					<ul>
						<li><a href="index.html">Home</a></li>
						<li><a href="elements.html">About us</a></li>
{#						<li><a href="elements.html">Our Purpose &#38; Objective</a></li>#}
{#						<li><a href="elements.html">Membership</a></li>#}
						<li><a href="elements.html">Asian &#38; Wellness Forum</a></li>
						<li><a href="search.html">Search</a></li>
						<li><a href="contact.html">Contact</a></li>
						<div class="clear"> </div>
					</ul>
				</div>
				<!---End-top-nav---->
                {% block content %}



                {% endblock %}



				<!---End-Content---->
				<!---start-sidebar---->
				<div class="side-bar">
					<div class="sidebar-top-add">
						<h3>Sponsersed by</h3>
						<a href="#"><img src="/static/images/add2.png" title="add"/></a>
					</div>
					<div class="presedent-img">
							<div class="Latest-news-title side-bar-sub-heading">
								<h3>Form the desk of President</h3>
								<h5> </h5>
								<div class="clear"> </div>
							</div>
						<a href="#"><img src="/static/images/prasedent.png" title="name" /></a>
					</div>
					<div class="sponsers-list">
						<h3>Sponsersed by</h3>
						<a href="#"><img src="/static/images/spons1.png" title="sponser-name" /></a>
						<a href="#"><img src="/static/images/spons1.png" title="sponser-name" /></a>
					</div>
				</div>
				<div class="clear"> </div>
				<!---End-sidebar---->
			</div>
			<!---End-main---->
			</div>
			<!---start-footer---->
			<div class="footer">
				<div class="footer-nav-grid">
					<ul>
						<li><a href="#">Home</a></li>
						<li><a href="#">About us</a></li>
						<li><a href="#">Our Purpose &#38; Objective</a></li>
						<li><a href="#">Membership</a></li>
						<li><a href="#">Asian &#38; Wellness Forum</a></li>
						<li><a href="#">Courses</a></li>
						<li><a href="#">Contact</a></li>
						<div class="clear"> </div>
					</ul>
				</div>
				<div class="footer-social-icons">
					<ul>
						<li><a href="#"><img src="/static/images/facebook.png" title="facebook" /></a></li>
						<li><a href="#"><img src="/static/images/twitter.png" title="twitter" /></a></li>
						<li><a href="#"><img src="/static/images/youtube.png" title="Youtube" /></a></li>
					</ul>
				</div>
				<div class="footer-form">
					<h3>Quick Contact</h3>
					<form>
						<div class="footer-text-boxs">
							<input type="text" class="textbox" value="Name:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Name';}">
							<input type="text" class="textbox" value="Email:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Email';}">
							<input type="text" class="textbox" value="mobile:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'mobile';}">
							<input type="text" class="textbox" value="Website:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Website';}">
						</div>
						<div class="footer-text-area">
							<textarea value="Message:" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Message';}">Message</textarea>
						</div>
						<input type="submit" value="Call Me">
					</form>
				</div>
				<div class="clear"> </div>
			</div>
			<!---End-footer---->
		<!---End-wrap--->
</body>
</html>

blog/index.html:

% extends 'base.html' %}

{% block title %} 首页{% endblock %}

{% block content %}
    <!---start-main---->
    <div class="main">
        <!---start-Content---->
        <div class="content">
            <div class="image-slider">
                <h3>Featured</h3>
                <div class="container">
                    <div id="slides">
                        <img src="/static/images/slider1.jpg" alt="">
                        <img src="/static/images/slider2.jpg" alt="">
                        <img src="/static/images/slider3.jpg" alt="">
                        <img src="/static/images/slider4.jpg" alt="">
                        <a href="#" class="slidesjs-next slidesjs-navigation"><i
                                class="icon-chevron-right icon-large"></i></a>
                    </div>
                </div>
                <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
                <script src="/static/js/jquery.slides.min.js"></script>
                <script>
                    $(function () {
                        $('#slides').slidesjs({
                            width: 940,
                            height: 285,
                            navigation: false
                        });
                    });
                </script>
            </div>
            <div class="clear"></div>
            <div class="Latest-news">
                <div class="Latest-news-title">
                    <h3>Latest Happening @ mawspa</h3>
                    <h5></h5>
                    <div class="clear"></div>
                </div>
                {% for book in books %}
                    <div class="blog-articals">
                        <div class="artical">
                            <div class="artical-heading">
                                <a href="/book/{{ book.id }}/"><h3>{{ book.btitle }}</h3></a>
                                <h4><span>Post On</span> {{ book.bpub_date }}</h4>
                            </div>
                            <div class="artical-box">
                                <div class="artical-img">
                                    <a href="/book/{{ book.id }}/"><img src="/{{ book.bimg }}" title="imag-name"/></a>
                                </div>
                                <div class="artical-info">
                                    <p>{{ book.bcontent }}
                                        <a href="/book/{{ book.id }}/">Read more...</a></p>
                                </div>
                                <div class="clear"></div>
                            </div>
                        </div>
                    </div>
                {% endfor %}


            </div>
            <a class="button" href="#">View All Updates</a>
        </div>
    </div>
    <!---End-Content---->
{% endblock %}

blog/detail.html:

{% extends 'base.html' %}

{% block title  %} 人物信息 {% endblock %}
{% block content %}
    <!---start-main---->
    <div class="main">
        <!---start-Content---->
        <div class="content">

            <div class="basic-elements">
                <div class="sub-wrap">
                    <div class="footer-form">
                        <h3 style="font-size: 50px;text-align: center ">{{ book.btitle }}</h3>
                    </div>
                    {% for hero in heros %}
                        <div class="common-heading">
                            <h1>{{ hero.hname }}</h1>
                        </div>
                        <div class="headings">
                            <p>{{ hero.hcontent }}</p>
                        </div>
                    {% endfor %}

                </div>
                <br>
            </div>
            <div class="clear"></div>
        </div>
    </div>
        <!---End-Content---->
 {% endblock  %}

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
学习django很好的入门书籍,详细介绍了django的mvc 模式等。是python用来做web开发的主流框架。 作为一个鼓励快速开发,并遵循MVC设计的框架,django现在十分流行。推荐学习了python的朋友都去看看django框架。 设计哲学   Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(Do Not Repeat Yourself)原则。   Django基于MVC的设计十分优美:   对象关系映射 (ORM,object-relational mapping)   以Python类形式定义你的数据模型,ORM将模型与关系数据库连接起来,你将得到一个非常容易使用的数据库API,同时你也可以在Django中使用原始的SQL语句。   URL 分派   使用正则表达式匹配URL,你可以任意设计的URL,没有框架的特定限定。象你喜欢的一样灵活。   模版系统   使用Django强大而可扩展的模板语言,可以分隔设计、内容和Python代码。并且具有可继承性。   表单处理   你可以方便的生成各种表单模型,实现表单的有效性检验。可以方便的从你定义的模型实例生成相应的表单。   Cache系统   可以挂在内存缓冲或其它的框架实现超级缓冲 -- 实现你所需要的粒度。   会话(session),用户登录与权限检查   快速开发用户会话功能。   国际化   内置国际化系统,方便开发出多种语言的网站。   自动化的管理界面   不需要你花大量的工作来创建人员管理和更新内容。Django自带一个ADMIN site,类似于内容管理系统。
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

咖啡或浮云

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值