python从入门到实践18章答案

目录

前言

一、新项目 

二、简短的条目

三、Django API

四、比萨店

1.创建虚拟环境、安装Django、创建项目、创建数据库、创建应用程序

2.定义模型

3.激活模型

4.向管理网站注册模型

5.创建超级用户

6.查看项目

 7.使用shell查看数据

五、膳食规划程序

1.创建虚拟环境、安装Django、创建项目、创建数据库、创建应用程序

2.映射URL

3.编写视图

4.编写模板

5.查看项目

六.比萨店主页

七.模板文档

八.比萨店页面

1.模板继承

2.显示所有pizza的页面

3.显示特定pizza的页面

4.查看项目


前言

 这里是《Python从入门到实践》的练习答案,如果有错误或者可以改进的地方欢迎在评论区指正


一、新项目 

进入虚拟环境:

b3adedc184774c50be0db476895568a1.png

 执行命令 django-admin.py startproject snap_gram 这一步与书中原步骤不同

3a6bbcccc1624137b1fc25c8a9b5915c.png

 同时  insta_chat  项目不进行此操作,将两者对比:

insta_chat\insta_env\Scripts   vs   snap_gram\snap_env\Scripts

131b8ef3c1574dfa90ce2dc0d9a8d604.png

 snap_gram  多出两个文件: django-admin.exe    sqlformat.exe

insta_chat\insta_env\Lib\site-packages  最开始:

e357c44817544a85afb679749b56fa2f.png

执行  pip install django  之后:

d8c982ce6a864340a4eeb5996dddef41.png

执行  django-admin startproject insta_chat .

(与  python3 django-admin.py startproject snap_gram .  效果相同) 之后无变化


二、简短的条目

以下是两次结果对比:

1aeed7d1405c430c887b9e71779eb980.png

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Topic(models.Model):
    """用户学习的主题"""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        """返回模型的字符串表示"""
        return self.text

class Entry(models.Model):
    """学到的有关某个主题的具体知识"""
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'entries'

        def __str__(self):
            """返回模型的字符串表示"""
            if len(self.text) > 50:
                return f"{self.text[:50]}..."
            else:
                return self.text

三、Django API

有关文档我放在下面了:

Making queries


四、比萨店

1.创建虚拟环境、安装Django、创建项目、创建数据库、创建应用程序

这几步就按书上操作就行:
86615fc0a6db41f0b52199e86b8bd2fd.png

另一个终端标签页:

175c5f8354814c5991ec25c46a8e3c43.png

2.定义模型

Pizzaeria\pizzas\models.py:

from django.db import models

class Pizza(models.Model):
    """用户点的pizza"""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """返回模型的字符串表示"""
        return self.text

class Topping(models.Model):
    """pizza的具体配料"""
    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE)
    # 外键是一个数据库术语, 它指向数据库中的另一条记录
    # 这里是将每个配料关联到特定pizza

    name = models.TextField()
    # 字段name用于存储配料

    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        """储存用于管理模型的额外信息"""
        verbose_name_plural = 'toppings'

    def __str__(self):
        """返回模型的字符串表示"""
        if len(self.name) > 50:
            return f"{self.pizza.text}{self.name[:50]}..."
        else:
            return self.pizza.text + '  ||  ' + self.name

3.激活模型

Pizzaeria\Pizzaeria\settings.py:

INSTALLED_APPS = [
    # 我的应用程序
    # 放在默认应用程序前面,这样能覆盖默认应用程序的行为
    'pizzas',

    # 默认应用程序
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

终端:

ae9c29401486473d9221c6a2868f5613.png

4.向管理网站注册模型

        Django自动在管理网站中添加了一些模型,如User和Group,但对于我们创建的模型,必须手工进行注册

Pizzaeria\pizzas\admin.py:

from django.contrib import admin

from .models import Pizza, Topping

admin.site.register(Pizza)
admin.site.register(Topping)

5.创建超级用户

终端:

edc4e400aa364f1ea288a96abd5dfc2c.png

 *Email 可以不填 Password 显示不出来

6.查看项目

终端中:运行第一行命令

1542e983367a426da890df528e68c588.png

访问此链接, 并在后面加上 /admin即可访问管理网站:

bb2f9acb30a84608a66dfe9d0bc2eb8d.png

 输入一些信息:

 08e936b27759438bbdd952f2618af73c.png

 7.使用shell查看数据

终端:

1f074a86e72d4a9fbc139d59461f2204.png


五、膳食规划程序

1.创建虚拟环境、安装Django、创建项目、创建数据库、创建应用程序

 这一步与第四题一样,照书上操作即可

2.映射URL

这里操作也与书上写得一样

meal_planner\meal_planner\urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('meal_planners.urls')),
]

新建meal_planner\meal_planners\urls.py

"""定义 meal_planners 的 URL 模式"""

from django.urls import path

from . import views

app_name = 'meal_planners'
urlpatterns = [
    # 主页
    path('', views.index, name='index'),
]

3.编写视图

meal_planner\meal_planner\views.py

from django.shortcuts import render

def index(request):
    """主页"""
    return render(request, 'meal_planners/index.html')

4.编写模板

新建meal_planner\meal_planners\templates\meal_planners\index.html

<p>Meal Planner</p>

<p>Meal Planner helps you plan your meals.</p>

5.查看项目

此操作也与上一题相同

效果:


六.比萨店主页

 

这一题操作与上一题相同,只需要记得项目名和应用程序名应为 Pizzaeria 和 pizzas


七.模板文档

链接放在这里了:

Django 模板


八.比萨店页面

        我们将创建三个显示数据的页面,除主页外,其中一个列出所有的主题,另一个显示特定主题的所有条目。

        对每个页面,我们都将指定URL模式、编写一个视图函数并编写一个模板。

        我们先创建一个父模板,项目中的其他模板都将继承他。

1.模板继承

        创建一个到主页的链接,这样任意页面都能通过它访问主页

        {% block content %}{% endblock content %}是一对块标签,其中包含的信息由子模板指定

        由于缩进过多,所以每个层级只缩进两个空格

新建Pizzaeria\pizzas\templates\pizzas\base.html

<p>
  <a href="{% url 'pizzas:index' %}">Pizzaeria</a>
</p>

{% block content %}{% endblock content %}

 重写index.html,使其继承base.html

{% extends 'pizzas/base.html' %}

{% block content %}
<p>Pizzaeria essential management procedures.</p>
{% endblock content %}

2.显示所有pizza的页面

URL模式   Pizzaeria\pizzas\urls.py

"""定义 pizzas 的 URL 模式"""

from django.urls import path

from . import views

app_name = 'pizzas'
urlpatterns = [
    # the homepage
    path('', views.index, name='index'),
    # display all pizzas
    path('pizzas/', views.pizzas, name='pizzas'),
]

 修改视图   Pizzaeria\pizzas\views.py

from django.shortcuts import render

from .models import Pizza

def index(request):
    """homepage of pizza shop"""
    return render(request, 'pizzas/index.html')

def pizzas(request):
    """display all pizzas"""
    pizzas = Pizza.objects.order_by('date_added')
    context = {'pizzas': pizzas}
    return render(request, 'pizzas/pizzas.html', context)

编辑此页面的模板    新建Pizzaeria\pizzas\templates\pizzas\pizzas.html

{% extends 'pizzas/base.html' %}

{% block content %}

  <p>Pizzas</p>

  <ul>
    {% for pizza in pizzas %}
      <li>{{ pizza }}</li>
    {% empty %}
      <li>No pizzas have been added yet.</li>
    {% endfor %}
  </ul>

{% endblock content %}

现在修改父模板,使其包含 到显示所有pizza的页面的链接

Pizzaeria\pizzas\templates\pizzas\base.html

<p>
  <a href="{% url 'pizzas:index' %}">Pizzaeria</a> -
  <a href="{% url 'pizzas:pizzas' %}">Pizzas</a>
</p>

{% block content %}{% endblock content %}

3.显示特定pizza的页面

URL模式   Pizzaeria\pizzas\urls.py

"""定义 pizzas 的 URL 模式"""

from django.urls import path

from . import views

app_name = 'pizzas'
urlpatterns = [
    # the homepage
    path('', views.index, name='index'),
    # display all pizzas
    path('pizzas/', views.pizzas, name='pizzas'),
    # a detailed page for a particular pizza
    path('pizzas/<int:pizza_id>', views.pizza, name='pizza'),
]

 修改视图   Pizzaeria\pizzas\views.py

from django.shortcuts import render

from .models import Pizza

def index(request):
    """homepage of pizza shop"""
    return render(request, 'pizzas/index.html')

def pizzas(request):
    """display all pizzas"""
    pizzas = Pizza.objects.order_by('date_added')
    context = {'pizzas': pizzas}
    return render(request, 'pizzas/pizzas.html', context)

def pizza(request, pizza_id):
    """display a single pizza and all its toppings"""
    pizza = Pizza.objects.get(id=pizza_id)
    toppings = pizza.topping_set.order_by('-date_added')
    context = {'pizza': pizza, 'toppings': toppings}
    return render(request, 'pizzas/pizza.html', context)

编辑此页面的模板    新建Pizzaeria\pizzas\templates\pizzas\pizza.html

{% extends 'pizzas/base.html' %}

{% block content %}

  <p>Pizza: {{ pizza }}</p>
  
  <p>Toppings:</p>
  <ul>
  {% for topping in toppings %}
    <li>
      <p>{{ topping.date_added|date:'M d, Y H:i' }}</p>
      <p>{{ topping.name|linebreaks }}</p>
    </li>
  {% empty %}
    <li>There are no toppings for this pizza yet.</li>
  {% endfor %}
  </ul>

{% endblock content %}

让 显示所有pizza的页面 的每个pizza 都链接到相应的页面

Pizzaeria\pizzas\templates\pizzas\pizzas.html

{% extends 'pizzas/base.html' %}

{% block content %}

  <p>Pizzas</p>

  <ul>
    {% for pizza in pizzas %}
      <li>
        <a href="{% url 'pizzas:pizza' pizza.id %}">{{ pizza }}</a>
      </li>

    {% empty %}
      <li>No pizzas have been added yet.</li>
    {% endfor %}
  </ul>

{% endblock content %}

4.查看项目

效果:

 

都看到这里了,不妨点个赞八

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值