python从入门到实践19章答案
目錄
前言
一、博客
1.建立項目
2.創建應用程序
3.Django管理網站
?4.讓用戶輸入數據
二、博客賬戶
1.應用程序users
2.登錄頁面
3.注銷
4.注冊頁面
三、重構
四、保護頁面new_entry
五、受保護的博客
1.使用@login_required限制訪問
2.將數據關聯到用戶
3.保護頁面
前言
這里是《Python從入門到實踐》的練習答案,如果有錯誤或者可以改進的地方歡迎在評論區指正
一、博客
1.建立項目
每次新建項目時操作都相似:
建立虛擬環境
激活虛擬環境
安裝django
在django中創建項目
創建數據庫
這一部分操作與第18章基本相同
終端:?
PS Blog> python -m venv Blog_env PS Blog> cd C:\softwaregongjv\Python\python_codes\Blog\Blog_env\Scripts PS Blog\Blog_env\Scripts> .\activate (Blog_env) PS Blog\Blog_env\Scripts> cd Blog(Blog_env) PS Blog> pip install django Collecting djangoUsing cached Django-4.0.6-py3-none-any.whl (8.0 MB) Collecting tzdataUsing cached tzdata-2022.1-py2.py3-none-any.whl (339 kB) --snip-- Installing collected packages: tzdata, sqlparse, asgiref, django Successfully installed asgiref-3.5.2 django-4.0.6 sqlparse-0.4.2 tzdata-2022.1 (Blog_env) PS Blog> django-admin startproject Blog . (Blog_env) PS Blog> python manage.py migrate Operations to perform:Apply all migrations: admin, auth, contenttypes, sessions Running migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OK--snip-- (Blog_env) PS Blog>2.創建應用程序
終端
(Blog_env) PS Blog> python manage.py startapp blogs定義模型 Blog\blogs\models.py
from django.db import modelsclass BlogPost(models.Model):"""a model of Blog page"""title = models.CharField(max_length=200)text = models.TextField()date_added = models.DateTimeField(auto_now_add=True)def __str__(self):# display simple information about the model# return a string representation of the modelreturn self.title +'=='+ self.text激活模型 Blog\Blog\settings.py
# Application definitionINSTALLED_APPS = [# my apps'blogs',# the default applications'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles', ]終端
(Blog_env) PS Blog> python manage.py makemigrations blogs Migrations for 'blogs':blogs\migrations\0001_initial.py- Create model BlogPost (Blog_env) PS Blog> python manage.py migrate Operations to perform:Apply all migrations: admin, auth, blogs, contenttypes, sessions Running migrations:Applying blogs.0001_initial... OK (Blog_env) PS Blog>3.Django管理網站
創建超級用戶 終端
(Blog_env) PS Blog> python manage.py createsuperuser Username (leave blank to use '--snip--'): 11-admin Email address: Password: Password (again): Superuser created successfully. (Blog_env) PS Blog>向管理網站注冊模型 Blog\blogs\admin.py
from django.contrib import adminfrom .models import BlogPostadmin.site.register(BlogPost)使用管理網站創建幾個簡短的帖子,效果如下:
?4.讓用戶輸入數據
這一步我借鑒了另一篇文章的答案,并略作修改,原文在此:
白桃提拉米蘇的答案
表單 新建?Blog\blogs\forms.py
from django import formsfrom .models import BlogPostclass BlogPostForm(forms.ModelForm):class Meta:model = BlogPostfields = ['title','text'] # 獲取模型里的兩個字段widgets = {'text': forms.Textarea(attrs={'cols':80})}視圖 Blog\blogs\views.py
from django.shortcuts import render,redirectfrom .models import BlogPostfrom .forms import BlogPostFormdef index(request):""" 主頁,顯示所有 """blogposts = BlogPost.objects.order_by('-date_added')context = {'blogposts':blogposts}return render(request,'blogs/index.html',context)def new_blog(request):""" 添加新博客 """if request.method != 'POST':form = BlogPostForm()else:form = BlogPostForm(data=request.POST)if form.is_valid():form.save()return redirect('blogs:index')context = {'form':form}return render(request,'blogs/new_blog.html',context)def edit_blog(request,blog_id):""" 編輯博客 """blogpost = BlogPost.objects.get(id=blog_id)title = blogpost.titleif request.method != 'POST':form = BlogPostForm(instance=blogpost)else:form = BlogPostForm(instance=blogpost,data=request.POST)if form.is_valid():form.save()return redirect('blogs:index')context = {'blogpost':blogpost,'title':title,'form':form}return render(request,'blogs/edit_blog.html',context)URL模式
Blog\Blog\urls.py
from django.contrib import admin from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('blogs.urls')), ]?Blog\Blogs\urls.py
from django.urls import pathfrom . import viewsapp_name = 'blogs'urlpatterns = [path('',views.index,name='index'),path('new_blog/',views.new_blog,name='new_blog'),path('edit_blog/<int:blog_id>/',views.edit_blog,name='edit_blog'), ]以下是所有html文件 路徑 Blog\blogs\templates\blogs\--snip--.html
base.html
<p><a href="{% url 'blogs:index' %}">BLOG</a> -<a href="{% url 'blogs:new_blog' %}">Add new blog</a> </p>{% block content %}{% endblock content%}index.html
{%extends 'blogs/base.html'%}{%block content%}<p><h1>Blog 主頁</h1></p><ul>{%for blogpost in blogposts%}<li><p>{{ blogpost.date_added|date:'Y m d, H:i' }}</p></li><p><h4>{{blogpost.title}}</h4></p><p>{{blogpost|linebreaks}}</p><a href="{%url 'blogs:edit_blog' blogpost.id%}">Edit Blog</a>{%empty%}<p>No blogs have been added.</p>{%endfor%}</ul>{%endblock content%}new_blog.html
{%extends 'blogs/base.html'%}{%block content%}<p><h2>Add A New Blog</h2></p><form action="{% url 'blogs:new_blog'%}" method="post">{% csrf_token %}{{ form.as_p }}<button name="submit">Add Blog</button></form>{%endblock content%}edit_blog.html
{%extends 'blogs/base.html'%}{%block content%}<p>{{ title }}</p><form action="{% url 'blogs:edit_blog' blogpost.id %}" method="post">{% csrf_token %}{{ form.as_p }}<button name="submit">Save changes</button></form>{%endblock content%}效果:
二、博客賬戶
1.應用程序users
創建一個名為users的應用程序?終端
(Blog_env) PS Blog> python manage.py startapp users (Blog_env) PS Blog> dir目錄: BlogMode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2022/7/28 18:28 Blog d----- 2022/7/29 16:44 blogs d----- 2022/7/28 18:24 Blog_env d----- 2022/7/30 9:56 users -a---- 2022/7/29 13:47 135168 db.sqlite3 -a---- 2022/7/28 18:27 682 manage.py(Blog_env) PS Blog>將users添加到settings.py中 Blog\Blog\settings.py
# Application definitionINSTALLED_APPS = [# my apps'blogs','users',# the default applications'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles', ]包含users的URL?Blog\Blog\urls.py
urlpatterns = [path('admin/', admin.site.urls),path('',include('blogs.urls')),path('users/',include('users.urls')), ]2.登錄頁面
新建?Blog\users\urls.py
"""define the URL pattern for the Users application"""from django.urls import path, includeapp_name = 'users' urlpatterns = [# contain the default authentication URLpath('', include('django.contrib.auth.urls')), ]模板login.html 新建 Blog\users\templates\registration\login.html
{% extends 'blogs/base.html' %}{% block content %}{% if form.errors %}<p>Your username and password didn't match.Please try again.</p>{% endif %}<form method="post" action="{% url 'users:login' %}">{% csrf_token %}{{ form.as_p }}<button name="submit">Log in</button><input type="hidden" name="next"value="{% url 'blogs:index' %}" /></form>{% endblock content %}在base.html中添加到登陸頁面的鏈接?
<p><a href="{% url 'blogs:index' %}">BLOG</a> -<a href="{% url 'blogs:new_blog' %}">Add new blog</a> -{% if user.is_authenticated %}Hello, {{ user.username }}.{% else %}<a href="{% url 'users:login' %}">Log in</a>{% endif %} </p>{% block content %}{% endblock content%}3.注銷
現在需要向用戶提交一個注銷的途徑
在 base.html中添加注銷鏈接 Blog\blogs\templates\blogs\base.html
<p><a href="{% url 'blogs:index' %}">BLOG</a> -<a href="{% url 'blogs:new_blog' %}">Add new blog</a> -{% if user.is_authenticated %}Hello, {{ user.username }}. -<a href="{% url 'users:logout' %}">Log out</a>{% else %}<a href="{% url 'users:login' %}">Log in</a>{% endif %} </p>{% block content %}{% endblock content%}注銷確認頁面 新建Blog\users\templates\registration\logged_out.html
{% extends 'blogs/base.html' %}{% block content %}<p>You have been logged out.Thank you for visiting!</p>{% endblock content %}效果:
?
?
4.注冊頁面
注冊頁面的URL模式?
"""define the URL pattern for the Users application"""from django.urls import path, includefrom . import viewsapp_name = 'users' urlpatterns = [# contain the default authentication URLpath('', include('django.contrib.auth.urls')),# register pagepath('register/', views.register, name='register'), ]注冊頁面的視圖函數 Blog\users\views.py
from django.shortcuts import render, redirect from django.contrib.auth import login from django.contrib.auth.forms import UserCreationFormdef register(request):"""register a new user"""if request.method != 'POST':# display an empty registration formform = UserCreationForm()else:# process completed formsform = UserCreationForm(data=request.POST)if form.is_valid():new_user = form.save()# let the user log in automatically and# redirect to the home pagelogin(request, new_user)return redirect('blogs:index')# display an empty form and indicate that the form is invalidcontext = {'form': form}return render(request, 'registration/register.html', context)注冊頁面的模板 Blog\users\templates\registration\register.html
{% extends 'blogs/base.html' %}{% block content %}<form method="post" action="{% url 'users:register' %}">{% csrf_token %}{{ form.as_p }}<button name="submit">Register</button><input type="hidden" name="next" value="{% url 'blogs:index' %}" /></form>{% endblock content %}修改base.html
<p><a href="{% url 'blogs:index' %}">BLOG</a> - <a href="{% url 'blogs:new_blog' %}">Add new blog</a> - {% if user.is_authenticated %}Hello, {{ user.username }}. - <a href="{% url 'users:logout' %}">Log out</a>{% else %}<a href="{% url 'users:register' %}">Register</a> -<a href="{% url 'users:login' %}">Log in</a>{% endif %} </p>{% block content %}{% endblock content%}三、重構
注意: 3、4題是對learning_log項目進行修改
修改書中的項目 learning_log\learning_logs\views.py
from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from django.http import Http404from .models import Topic, Entry from .forms import TopicForm, EntryForm # Create your views here. def index(request):"""學習筆記的主頁"""return render(request, 'learning_logs/index.html')@login_required def topics(request):"""顯示所有的主題"""topics = Topic.objects.filter(owner=request.user).order_by('date_added')context = {'topics': topics}return render(request, 'learning_logs/topics.html', context)@login_required def topic(request, topic_id):"""顯示單個主題及其所有的條目"""topic = Topic.objects.get(id=topic_id)# 確認請求的主題屬于當前用戶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)@login_required def new_topic(request):"""添加新主題"""if request.method != 'POST':# 未提交數據:創建一個新表單form = TopicForm()else:# POST 提交的數據:對數據進行處理form = TopicForm(data=request.POST)if form.is_valid():new_topic = form.save(commit=False)new_topic.owner = request.usernew_topic.save()return redirect('learning_logs:topics')# 顯示空表單或指出表單數據無效context = {'form': form}return render(request, 'learning_logs/new_topic.html', context)@login_required def new_entry(request, topic_id):"""在特定主題中添加新條目"""topic = Topic.objects.get(id=topic_id)if request.method != 'POST':# 未提交數據,創建一個空表單form = EntryForm()else:# POST 提交的數據:對數據進行處理form = EntryForm(data=request.POST)if form.is_valid():new_entry = form.save(commit=False)new_entry.topic = topicnew_entry.save()return redirect('learning_logs:topic', topic_id=topic_id)# 顯示空表單或指出表單數據無效context = {'topic': topic, 'form': form}return render(request, 'learning_logs/new_entry.html', context)@login_required def edit_entry(request, entry_id):"""編輯既有條目"""entry = Entry.objects.get(id=entry_id)topic = entry.topiccheck_topic_owner(topic, request)if request.method != 'POST':"""初次請求"""form = EntryForm(instance=entry)else:# POST 提交的數據:對數據進行處理form = EntryForm(instance=entry, data=request.POST)if form.is_valid():form.save()return redirect('learning_logs:topic', topic_id=topic.id)context = {'entry': entry, 'topic': topic, 'form': form}return render(request, 'learning_logs/edit_entry.html', context)def check_topic_owner(topic, request):# 確認請求的主題屬于當前用戶if topic.owner != request.user:raise Http404效果:
四、保護頁面new_entry
?
修改書中的項目 learning_log\learning_logs\views.py
@login_required def new_entry(request, topic_id):"""在特定主題中添加新條目"""topic = Topic.objects.get(id=topic_id)check_topic_owner(topic, request)if request.method != 'POST':# 未提交數據,創建一個空表單form = EntryForm()else:# POST 提交的數據:對數據進行處理form = EntryForm(data=request.POST)if form.is_valid():new_entry = form.save(commit=False)new_entry.topic = topicnew_entry.save()return redirect('learning_logs:topic', topic_id=topic_id)# 顯示空表單或指出表單數據無效context = {'topic': topic, 'form': form}return render(request, 'learning_logs/new_entry.html', context)效果:
?
五、受保護的博客
? ? ? ? 我們將創建一個系統,確定各項博文所屬的用戶。已登錄用戶能發表、修改自己的博文,任何用戶都能訪問所有博文
1.使用@login_required限制訪問
Blog\blogs\views.py
from django.shortcuts import render,redirect from django.contrib.auth.decorators import login_requiredfrom .models import BlogPostfrom .forms import BlogPostFormdef index(request):""" 主頁,顯示所有 """blogposts = BlogPost.objects.order_by('-date_added')context = {'blogposts':blogposts}return render(request,'blogs/index.html',context)@login_required def new_blog(request):""" 添加新博客 """if request.method != 'POST':form = BlogPostForm()else:form = BlogPostForm(data=request.POST)if form.is_valid():form.save()return redirect('blogs:index')context = {'form':form}return render(request,'blogs/new_blog.html',context)@login_required def edit_blog(request,blog_id):""" 編輯博客 """blogpost = BlogPost.objects.get(id=blog_id)title = blogpost.titleif request.method != 'POST':form = BlogPostForm(instance=blogpost)else:form = BlogPostForm(instance=blogpost,data=request.POST)if form.is_valid():form.save()return redirect('blogs:index')context = {'blogpost':blogpost,'title':title,'form':form}return render(request,'blogs/edit_blog.html',context)在Blog\Blog\settings.py末尾添加
# my settings LOGIN_URL = 'users:login'2.將數據關聯到用戶
修改模型BlogPost? ?Blog\blogs\models.py
from django.db import models from django.contrib.auth.models import Userclass BlogPost(models.Model):"""a model of Blog page"""title = models.CharField(max_length=200)text = models.TextField()date_added = models.DateTimeField(auto_now_add=True)owner = models.ForeignKey(User, on_delete=models.CASCADE)def __str__(self):# display simple information about the model# return a string representation of the modelreturn self.text遷移數據庫 終端
(Blog_env) PS Blog> python manage.py shell >>> from django.contrib.auth.models import User >>> User.objects.all() <QuerySet [<User: 11-admin>]> >>> for user in User.objects.all(): ... print(user.username, user.id) ... 11-admin 1 >>> exit() (Blog_env) PS Blog> python manage.py makemigrations blogs Select an option:1 >>> 1 (Blog_env) PS Blog> python manage.py migrate (Blog_env) PS Blog> python manage.py shell >>> from blogs.models import BlogPost >>> for blog in BlogPost.objects.all(): ... print(blog.title, blog.owner) ... 賬單同 11-admin 徐梓蕊 11-admin --snip-- >>> exit() (Blog_env) PS Blog>3.保護頁面
edit_blog 修改?Blog\blogs\views.py 的部分方法
@login_required def edit_blog(request,blog_id):""" 編輯博客 """blogpost = BlogPost.objects.get(id=blog_id)title = blogpost.title# protect the pageif blogpost.owner != request.user:raise Http404if request.method != 'POST':form = BlogPostForm(instance=blogpost)else:form = BlogPostForm(instance=blogpost,data=request.POST)if form.is_valid():form.save()return redirect('blogs:index')context = {'blogpost':blogpost,'title':title,'form':form}return render(request,'blogs/edit_blog.html',context)將新主題關聯到當前用戶?修改?Blog\blogs\views.py 的部分方法
@login_required def new_blog(request):""" 添加新博客 """if request.method != 'POST':form = BlogPostForm()else:form = BlogPostForm(data=request.POST)if form.is_valid():new_blog = form.save(commit=False)new_blog.owner = request.usernew_blog.save()return redirect('blogs:index')context = {'form':form}return render(request,'blogs/new_blog.html',context)都看到這里了,不妨點個贊八~
總結
以上是生活随笔為你收集整理的python从入门到实践19章答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公司监控显示无网络连接服务器,监控显示无
- 下一篇: Centos7 下mysql8.0的安装