目录
1.创建虚拟环境、安装Django、创建项目、创建数据库、创建应用程序
1.创建虚拟环境、安装Django、创建项目、创建数据库、创建应用程序
前言
这里是《Python从入门到实践》的练习答案,如果有错误或者可以改进的地方欢迎在评论区指正
一、新项目
进入虚拟环境:
执行命令 django-admin.py startproject snap_gram 这一步与书中原步骤不同
同时 insta_chat 项目不进行此操作,将两者对比:
insta_chat\insta_env\Scripts vs snap_gram\snap_env\Scripts
snap_gram 多出两个文件: django-admin.exe sqlformat.exe
insta_chat\insta_env\Lib\site-packages 最开始:
执行 pip install django 之后:
执行 django-admin startproject insta_chat .
(与 python3 django-admin.py startproject snap_gram . 效果相同) 之后无变化
二、简短的条目
以下是两次结果对比:
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
有关文档我放在下面了:
四、比萨店
1.创建虚拟环境、安装Django、创建项目、创建数据库、创建应用程序
这几步就按书上操作就行:
另一个终端标签页:
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',
]
终端:
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.创建超级用户
终端:
*Email 可以不填 Password 显示不出来
6.查看项目
终端中:运行第一行命令
访问此链接, 并在后面加上 /admin即可访问管理网站:
输入一些信息:
7.使用shell查看数据
终端:
五、膳食规划程序
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
七.模板文档
链接放在这里了:
八.比萨店页面
我们将创建三个显示数据的页面,除主页外,其中一个列出所有的主题,另一个显示特定主题的所有条目。
对每个页面,我们都将指定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.查看项目
效果:
都看到这里了,不妨点个赞八