MVT小案列

1.创建模型类:

from django.db import models

# Create your models here.

class BookInfo(models.Model):
    '''图书模型类'''
    title = models.CharField(max_length=20)
    pub_date = models.DateField()
    read = models.IntegerField(default=0)


class HeroInfo(models.Model):
    # 关系属性,建立图书类和英雄类一对多关系
    book = models.ForeignKey('BookInfo')
    name = models.CharField(max_length=5)
    # 性别采用布尔字段,默认Flase为男
    gender = models.BooleanField(default=False)
    comment = models.CharField(max_length=120)

2.生成迁移文件和执行迁移生成表:

python manage.py makemigrations
python manage.py migrate

3.通过模型类操作数据表:

python manage.py shell

   导入模型类:

from booktest.models import BookInfo,HeroInfo

  进行数据操作:

>>> b = BookInfo()  # 定义一个BookInfo类的对象
>>> b.title='天龙八部'  # 给title属性赋值
>>> from datetime import date
>>> b.pub_date = date(1990,10,11)
>>> b.save()  # 执行这部才会将数据保存进数据库
>>> b2 = BookInfo()
>>> b2.title = '射雕英雄传'
>>> b2.pub_date = date(1991,1,1)
>>> b2.save()
>>> h = HeroInfo()
>>> h.name = '郭靖'
>>> h.gender = False
>>> h.comment = '主角,武功盖世'
>>> h.book = b2
>>> h.save()
>>> h2 = HeroInfo()
>>> h2.name = '乔峰'
>>> h2.gender = False
>>> h2.book = b
>>> h2.save()
>>> h2.comment = '男主角,厉害'
>>> h2.save
<bound method Model.save of <HeroInfo: HeroInfo object>>
>>> h2.save()

最后,可以看出数据都已添加进数据库

 

4.定义视图函数:

​
​
from django.shortcuts import render
from booktest import models  
# Create your views here.

def show_books(request):
    '''显示图书详细信息'''
    # 1.从M中获取图书信息
    books_info = models.BookInfo.objects.all()  # 返回一个对象列表
    # 2.返回数据
    return render(request, 'booktest/show_books.html', {'books': books_info})


def detail(request, bid):
    # 根据bid查找图书信息
    book_info = models.BookInfo.objects.get(id=bid)
    # 查询出book_info图书中所有的英雄人物信息
    heros_info = book_info.heroinfo_set.all()
    # 返回数据
    return render(request, 'booktest/detail.html', {'book': book_info, 'heros': heros_info})

​

​

注意:第二行我想from booktest.models import BookInfo这样导入,但是Django会报错找不到models,所以我直接导入models。这是因为pycharm路径问题,后续找出解决方案。

5.配置urls:

from django.conf.urls import url
from booktest import views

urlpatterns = [
    url(r'^books$', views.show_books),
    url(r'^books/(\d+)$', views.detail),  # 利用正则表达式分组后,django会把分组的内容当做参数传进视图函数中

]

注意:这里要利用正则表达式分组,这样django会把内容传递给视图函数中的参数,这里是传递给bid这个参数

6.创建模板文件夹,分别定义books.html和detail.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{ book.title }}</h1>
英雄信息如下:<br>

<ul>
    {% for hero in heros %}
        <li>{{ hero.name }}---{{ hero.comment }}</li>
    {% empty %}
        <li>当heros这个列表为空时执行这条语句</li>
    {% endfor %}
</ul>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<ul>
    <!-- 这里返回的是对象,要想得到标题就 对象.标题 -->
    {% for i in books %}
        <li><a href="/books/{{ i.id }}">{{ i.title }}</a> </li>
    {% endfor %}
</ul>
</body>
</html>

总结:当一个浏览器向Django网站服务器请求页面时,先会到项目的urls中进行匹配,然后再到应用的urls中进行匹配,匹配成功之后执行相应的视图函数,在视图函数中调用模板文件,最后返回内容显示给浏览器。

猜你喜欢

转载自blog.csdn.net/wenpy/article/details/90678097
今日推荐