目录
前言
一、其他表单
二、设置博客的格式
三、在线博客
四、在更多情况下显示404错误页面
五、扩展“学习笔记”
1.修改模型
2.添加页面
3.修改html文件
前言
这里是《Python从入门到实践》的练习答案,如果有错误或者可以改进的地方欢迎在评论区指正
一、其他表单
下面是官方文档,大家有兴趣可以自行探索哦
Bootstrap官方文档
new_topic 页面
{% extends "learning_logs/base.html" %}
{% load bootstrap4 %}
{% block content %}
Add a new topic:
{% endblock content %}
new_entry 页面
{% extends "learning_logs/base.html" %}
{% load bootstrap4 %}
{% block content %}
{{ topic }}
Add a new entry:
{% endblock content %}
同理 edit_entry 页面
{% extends "learning_logs/base.html" %}
{% load bootstrap4 %}
{% block content %}
{{ topic }}
Edit entry:
{% endblock content %}
二、设置博客的格式
重写全部html文件
base.html
{% load bootstrap4 %}
BLOG
{% bootstrap_css %}
{% bootstrap_javascript jquery='full' %}
{% block page_header %}{% endblock page_header %}
{% block content %}{% endblock content %}
edit_blog.html
{%extends 'blogs/base.html'%}
{% load bootstrap4 %}
{%block content%}
{{ title }}
Edit Blog:
{%endblock content%}
new_blog.html
{{%extends 'blogs/base.html'%}
{% load bootstrap4 %}
{% block page_header %}
Add A New Blog
{% endblock page_header %}
{%block content%}
{%endblock content%}
index.html
{%extends 'blogs/base.html'%}
{% block page_header %}
BLOG 主页
{% endblock page_header %}
{%block content%}
-
{%for blogpost in blogposts%}
{{ blogpost.date_added|date:'Y/m/d, H:i' }}
Edit Blog
{{blogpost.title}}
{{blogpost|linebreaks}}
{%empty%}
No blogs have been added yet.
{%endfor%}
No blogs have been added yet.
{%endfor%}login.html
{% extends 'blogs/base.html' %}
{% load bootstrap4 %}
{% block page_header %}
Log in to your account.
{% endblock page_header %}
{% block content %}
{% endblock content %}
logged_out.html
{% extends 'blogs/base.html' %}
{% block content %}
You have been logged out. Thank you for visiting!
{% endblock content %}
register.html
{% extends 'blogs/base.html' %}
{% load bootstrap4 %}
{% block page_header %}
Register Here
{% endblock page_header %}
{% block content %}
{% endblock content %}
结果:
三、在线博客
部署到云服务器比较麻烦,这里给大家推荐几个博客
windows Git Heroku下载、Heroku注册问题
Outlook 邮箱注册教程
Heroku CLI 官方链接在此:
Heroku CLI 官方安装地址(含Git 官方安装地址)
安装psycopg2==2.7.*报错heroku不能登录
现在唯一的问题是注册heroku时需要翻墙才能获得验证码,如果有大佬有方法绕过或者有梯子可以在评论区分享
这一题步骤与书上代码应该一样,这里就不赘述了,上面的博客应该能解决大部分问题
四、在更多情况下显示404错误页面
修改views.py
--snip--
@login_required
def new_entry(request, topic_id):
"""在特定主题中添加新条目"""
topic = get_object_or_404(Topic, id=topic_id)
check_topic_owner(topic, request)
if request.method != 'POST':
# 未提交数据,创建一个空表单
form = EntryForm()
--snip--
@login_required
def edit_entry(request, entry_id):
"""编辑既有条目"""
entry = get_object_or_404(Entry, id=entry_id)
topic = entry.topic
check_topic_owner(topic, request)
if request.method != 'POST':
"""初次请求"""
--snip
效果:
五、扩展“学习笔记”
在主页中对项目做更详细的描述
修改index.html 添加一条中文描述
{% extends "learning_logs/base.html" %}
{% block page_header %}
Track your learning.
Make your own Learning Log, and keep a list of the
topics you're learning about.Whenever you learn something new
about a topic, make an entry summarizing what you've learned.
Learning Log 能让用户记录感兴趣的主题,并在学习每个主题的过程中添加
日志条目。
Register »
{% endblock page_header %}
效果:
添加将主题设置为公开的功能
1.修改模型
修改models.py中Topic模型 加一个public属性
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)
public = models.BooleanField(default=False)
def __str__(self):
return self.text
2.添加页面
修改urls.py 增加一个新的页面显示公共的主题
"""定义 learning_logs 的 URL 模式"""
from django.urls import path
from . import views
app_name = 'learning_logs'
urlpatterns = [
# 主页
path('', views.index, name='index'),
# 显示所有主题
path('topics/', views.topics, name='topics'),
# 特定主题的详细页面
path('topics//', views.topic, name='topic'),
# 用于添加新主题的页面
path('new_topic/', views.new_topic, name='new_topic'),
# 用于添加新条目的页面
path('new_entry//', views.new_entry, name='new_entry'),
# 用于编辑条目的页面
path('edit_entry//', views.edit_entry, name='edit_entry'),
# 显示公共主题
path('public_topics/', views.public_topics, name='public_topics'),
]
在view.py 中 新增视图函数public_topics,并修改一下topic函数的逻辑
def public_topics(request):
"""显示公开的主题"""
topics = list(Topic.objects.all().order_by('-date_added'))
for topic in topics[:]:
if topic.public == False:
topics.remove(topic)
context = {'topics': topics}
return render(request, 'learning_logs/public_topics.html', context)
--snip--
# @login_required
def topic(request, topic_id):
"""显示单个主题及其所有的条目"""
topic = get_object_or_404(Topic, id=topic_id)
if topic.public == False:
check_topic_owner(topic, request)
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
在form.py中 修改TopicForm函数 新增一个表单元素
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields = ['text', 'public']
labels = {'text': '', 'public': ''}
3.修改html文件
我们希望所有人都能通过导航栏看见公共主题
修改base.html
--snip--
- Topics _
- Public Topics
模仿topics.html 新建public.html
{% extends "learning_logs/base.html" %}
{% block page_header %}
Public Topics
{% endblock page_header %}
{% block content %}
-
{% for topic in topics %}
- {{ topic }} {{ topic.owner }} {% empty %}
- No public topics have been added yet. {% endfor %}
非主题所有者不能修改主题
修改 topic.html 的逻辑
{% extends 'learning_logs/base.html' %}
{% block page_header %}
{{ topic }}
{% if user == topic.owner %}
Public: {{ topic.public }}{% endif %}
{% endblock page_header %}
{% block content %}
{% if user == topic.owner %}
Add new entry
{% endif %}
{% for entry in entries %}
{{ entry.date_added|date:'M d, Y H:i' }}
{% if user == topic.owner %}
edit entry{% endif %}
{{ entry.text|linebreaks }}
{% empty %}
There are no entries for this topic yet.
{% endfor %}
{% endblock content %}
我们希望新建主题时,能提示用户是否将其设置为public
修改new_topic.html
{% extends "learning_logs/base.html" %}
{% load bootstrap4 %}
{% block content %}
Add a new topic:
{% endblock content %}
最后,迁移项目,迁移在线数据库
(ll_env) PS learning_log> git add . (ll_env) PS learning_log> git commit -am "Add a new function." (ll_env) PS learning_log> git push heroku master (ll_env) PS learning_log> heroku run python manage.py migrate
最后,可以在主页解释一下新功能
这样就大功告成了!
都看到这里了不妨点个赞八~



