aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/learn/server-side/django/django_assessment_blog/index.html
blob: a3ca28e160cc6bba31459c3ded5d39c27c10978a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
---
title: 评估:DIY Django 微博客
slug: learn/Server-side/Django/django_assessment_blog
translation_of: Learn/Server-side/Django/django_assessment_blog
---
<div>{{LearnSidebar}}</div>

<div>{{PreviousMenu("Learn/Server-side/Django/web_application_security", "Learn/Server-side/Django")}}</div>

<p class="summary">在这个评估中,您将使用您在 <a href="/en-US/docs/Learn/Server-side/Django">Django Web Framework (Python)</a> 模块中获得的知识,来创建一个非常基本的博客。</p>

<table class="learn-box standard-table">
 <tbody>
  <tr>
   <th scope="row">先决条件:</th>
   <td>在尝试此评估之前,您应该已经完成​​了本模块中的所有文章。</td>
  </tr>
  <tr>
   <th scope="row">目标:</th>
   <td>测试对Django基础知识的理解,包括URL配置,模型,视图,表单和模板。</td>
  </tr>
 </tbody>
</table>

<h2 id="項目概要">項目概要</h2>

<p>下面列出了需要显示的页面、URL和其它要求:</p>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">页面</th>
   <th scope="col">URL</th>
   <th scope="col">要求</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>主页</td>
   <td><code>/</code> and <code>/blog/</code></td>
   <td>描述站点的索引页面。</td>
  </tr>
  <tr>
   <td>所有博客文章列表</td>
   <td><code>/blog/blogs/</code></td>
   <td>
    <p>所有博客文章列表:</p>

    <ul>
     <li>可通过侧边栏链接访问所有用户。</li>
     <li>列表的排序按发布日期(从最新到最旧)。</li>
     <li>列表分页为每 5 篇文章 1 个分页。</li>
     <li>列表项显示博客标题,发布日期和作者。</li>
     <li>博客帖子名称,链接到博客详细信息页面。</li>
     <li>博主(作者姓名)链接到博客作者详细信息页面。</li>
    </ul>
   </td>
  </tr>
  <tr>
   <td>博客作者(博主)详细信息页面</td>
   <td><code>/blog/blogger/<em>&lt;author-id&gt;</em></code></td>
   <td>
    <p>指定作者的信息(按ID)和他们的博客文章列表:</p>

    <ul>
     <li>可以从博客文章等的作者链接访问所有用户</li>
     <li>包含有关博主/作者的一些简要经历信息。</li>
     <li>按发布日期排序的列表(从最新到最旧)。</li>
     <li>没有分页。</li>
     <li>列表项仅显示博客帖子名称和发布日期。</li>
     <li>博客帖子名称,链接到博客详细信息页面。</li>
    </ul>
   </td>
  </tr>
  <tr>
   <td>博客帖子详细信息页面</td>
   <td><code>/blog/<em>&lt;blog-id&gt;</em></code></td>
   <td>
    <p>博客帖子详情。</p>

    <ul>
     <li>可从博客帖子列表访问所有用户。</li>
     <li>页面包含博客文章:姓名,作者,发布日期和内容。</li>
     <li>博客文章的评论应显示在底部。</li>
     <li>评论应按顺序排序:从最旧到最近。</li>
     <li>包含为登录用户添加注释的链接(请参阅注释表单页面)</li>
     <li>博客帖子和评论,只需显示纯文本。不需要支持任何类型的HTML标记(例如链接,图像,粗体/斜体等)。</li>
    </ul>
   </td>
  </tr>
  <tr>
   <td>所有博主的名单</td>
   <td><code>/blog/bloggers/</code></td>
   <td>
    <p>系统上的博主列表:</p>

    <ul>
     <li>可从站点侧栏访问所有用户</li>
     <li>博主名称链接到博客作者详细信息页面。</li>
    </ul>
   </td>
  </tr>
  <tr>
   <td>评论表单页面</td>
   <td><code>/blog/<em>&lt;blog-id&gt;</em>/create</code></td>
   <td>
    <p>为博客帖子创建评论:</p>

    <ul>
     <li>只能从博客帖子详细信息页面底部的链接,访问登录用户(仅限)。</li>
     <li>显示表单以及用于输入注释的描述(发布日期和博客不可编辑)。</li>
     <li>发布评论后,该页面将重定向回相关的博客帖子页面。</li>
     <li>用户无法编辑或删除其帖子。</li>
     <li>注销用户将被引导至登录页面进行登录,然后才能添加评论。登录后,他们将被重定向,回到他们想要评论的博客页面。</li>
     <li>评论页面应包含被评论的博客帖子的名称/链接。</li>
    </ul>
   </td>
  </tr>
  <tr>
   <td>用户认证页面</td>
   <td><code>/accounts/<em>&lt;standard urls&gt;</em></code></td>
   <td>
    <p>用于登录,注销和设置密码的标准Django身份验证页面:</p>

    <p> </p>

    <ul>
     <li>应该可以通过侧边栏链接,访问登录/退出页面。</li>
    </ul>
   </td>
  </tr>
  <tr>
   <td>管理站点</td>
   <td><code>/admin/<em>&lt;standard urls&gt;</em></code></td>
   <td>
    <p>应启用管理站点,以允许创建/编辑/删除博客帖子、博客作者、和博客评论(这是博客创建新博客帖子的机制):</p>

    <p> </p>

    <ul>
     <li>管理站点的博客帖子记录,应显示内联的相关评论列表(在每篇博客文章下方)。</li>
     <li>管理站点中的注释名称,是通过将注释说明,截断为75个字符来创建的。</li>
     <li>其他类型的记录,可以使用基本注册。</li>
    </ul>
   </td>
  </tr>
 </tbody>
</table>

<p>此外,您应该编写一些基本测试来验证:</p>

<ul>
 <li>所有模型字段都具有正确的标签和长度。</li>
 <li>所有模型都具有预期的对象名称(例如<code> __str__()</code> 返回预期值)。</li>
 <li>模型具有单个博客和评论记录的预期URL(例如,<code>get_absolute_url()</code>返回预期的URL)。</li>
 <li>BlogListView(所有博客页面)可在预期位置访问(例如 /blog/blogs)</li>
 <li>BlogListView(所有博客页面)可通过预期的命名网址访问(例如 'blogs')</li>
 <li>BlogListView(所有博客页面)使用预期的模板(例如默认模板)</li>
 <li>BlogListView 以 5 个记录为 1 个分页(至少在第一页上)</li>
</ul>

<div class="note">
<p><strong>注意</strong>: 当然还有许多其他测试可以运行。请谨慎使用,但我们希望您至少进行上述测试。</p>
</div>

<p>以下部分,显示了实现上述要求的站点的屏幕截图。</p>

<h2 id="截图">截图</h2>

<p>以下屏幕截图,提供了完成的程序应输出的示例。</p>

<h3 id="所有博客文章列表">所有博客文章列表</h3>

<p>这将显示所有博客帖子的列表(可从侧栏中的“所有博客” All blogs 链接访问)。注意事项:</p>

<ul>
 <li>侧栏还列出了登录用户。</li>
 <li>个人博客帖子和博主可以作为页面中的链接访问。</li>
 <li>启用分页(以 5 个为一组)</li>
 <li>次序是从最新到最旧。</li>
</ul>

<p><img alt="List of all blogs" src="https://mdn.mozillademos.org/files/14319/diyblog_allblogs.png" style="border-style: solid; border-width: 1px; display: block; height: 363px; margin: 0px auto; width: 986px;"></p>

<h3 id="所有博主的列表">所有博主的列表</h3>

<p>这提供了到所有博客的链接,如同来自侧栏中的“所有博客” All bloggers 链接。在这种情况下,我们可以从侧边栏看到,并没有用户登录。</p>

<p><img alt="List of all bloggers" src="https://mdn.mozillademos.org/files/14321/diyblog_blog_allbloggers.png" style="border-style: solid; border-width: 1px; display: block; height: 256px; margin: 0px auto; width: 493px;"></p>

<h3 id="博客详情页面">博客详情页面</h3>

<p>这显示了指定博客的详细信息页面。</p>

<p><img alt="Blog detail with add comment link" src="https://mdn.mozillademos.org/files/14323/diyblog_blog_detail_add_comment.png" style="border-style: solid; border-width: 1px; display: block; height: 640px; margin: 0px auto; width: 986px;"></p>

<p>请注意,注释具有日期和时间,并且从最旧到最新排序(与博客次序相反)。最后,我们有一个链接,用于访问表单,以添加新评论。如果用户未登录,我们会看到登录的建议。</p>

<p><img alt="Comment link when not logged in" src="https://mdn.mozillademos.org/files/14325/diyblog_blog_detail_not_logged_in.png" style="border-style: solid; border-width: 1px; display: block; height: 129px; margin: 0px auto; width: 646px;"></p>

<h3 id="添加评论表单">添加评论表单</h3>

<p>这是添加评论的表单。请注意,我们已登录。如果成功,我们应该返回相关的博客帖子页面。</p>

<p><img alt="Add comment form" src="https://mdn.mozillademos.org/files/14329/diyblog_comment_form.png" style="border-style: solid; border-width: 1px; display: block; height: 385px; margin: 0px auto; width: 778px;"></p>

<h3 id="作者简介">作者简介</h3>

<p>这会显示博主的个人信息及其博客帖子列表。</p>

<p><img alt="Blogger detail page" src="https://mdn.mozillademos.org/files/14327/diyblog_blogger_detail.png" style="border-style: solid; border-width: 1px; display: block; height: 379px; margin: 0px auto; width: 982px;"></p>

<h2 id="完成的步骤">完成的步骤</h2>

<p>以下部分,描述了您需要执行的操作。</p>

<ol>
 <li>为站点创建骨架项目和Web应用程序(如<a href="/zh-CN/docs/Learn/Server-side/Django/skeleton_website">Django教程 2:创建骨架网站</a>中所述)。您可以使用 'diyblog' 作为项目名称,使用 'blog' 作为应用程序名称。</li>
 <li>为博客帖子,评论和所需的任何其他对象创建模型。在考虑您的设计时,请记住:
  <ul>
   <li>每个评论只有一个博客,但博客可能有很多评论。</li>
   <li>博客帖子和评论,必须按发布日期排序。</li>
   <li>并非每个用户都必须是博客作者,尽管任何用户都可能是评论者。</li>
   <li>博客作者还必须包含个人信息。</li>
  </ul>
 </li>
 <li>为新模型运行迁移,并创建超级用户。</li>
 <li>使用管理站点,创建一些示例博客帖子,和博客评论。</li>
 <li>为博客帖子、和博客列表页面,创建视图、模板、和 URL 配置。</li>
 <li>为博客帖子、和博客详细信息页面,创建视图、模板、和 URL 配置。</li>
 <li>创建一个页面,其中包含用于添加新评论的表单(请记住,这仅适用于已登录的用户!)</li>
</ol>

<h2 id="提示和技巧">提示和技巧</h2>

<p>该项目与 <a href="/en-US/docs/Learn/Server-side/Django/Tutorial_local_library_website">LocalLibrary</a> 教程非常相似。您将能够使用几乎所有相同的方法,包含设置框架,用户登录/注销行为,对静态文件,视图,URL,表单,基本模板和管理站点配置的支持。</p>

<p>一些一般提示:</p>

<ol>
 <li>索引页面可以实现为基本功能视图和模板(就像locallibrary一样)。</li>
 <li>T可以使用<a href="/zh-CN/docs/Learn/Server-side/Django/Generic_views">通用列表和详细信息视图</a>,以创建博客帖子和博主的列表视图,以及博客帖子的详细信息视图。</li>
 <li>可以使用通用列表的博客列表视图,并对指定作者匹配的博客对象进行过滤,来创建特定作者的博客帖子列表。
  <ul>
   <li>您将必须实现<code>get_queryset(self)</code>来进行过滤(很像我们的图书馆类<code>LoanedBooksAllListView</code>),并从URL获取作者信息。</li>
   <li>您还需要将作者的名称,传递给上下文中的页面。要在基于类的视图中执行此操作,您需要实现<code>get_context_data()</code>(在下面讨论)。</li>
  </ul>
 </li>
 <li>可以使用基于函数的视图(以及关联的模型和表单),或使用通用<code>CreateView</code>,以创建添加注释表单。如果您使用<code>CreateView</code>(推荐),那么:
  <ul>
   <li>您还需要将博客文章的名称,传递到上下文中的评论页面(实现<code>get_context_data()</code> ,如下所述)。</li>
   <li>表单应仅显示用户输入的注释“description”(日期和相关的博客文章,不应该是可编辑的)。由于它们本身不在表单中,因此您的代码,需要在<code> form_valid()</code> 函数中,设置注释的作者,以便将其保存到模型中(<a href="https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-editing/#models-and-request-user">如此处所述</a> -  Django文档)。在同一个功能中,我们设置了相关的博客。可能的实现如下所示(<code>pk</code>是从URL / URL配置传入的博客ID)。
    <pre class="brush: python">    def form_valid(self, form):
        """
        Add author and associated blog to form data before setting it as valid (so it is saved to model)
        """
        #Add logged-in user as author of comment
        form.instance.author = self.request.user
        #Associate comment with blog based on passed id
        form.instance.blog=get_object_or_404(Blog, pk = self.kwargs['pk'])
        # Call super-class form validation behaviour
        return super(BlogCommentCreate, self).form_valid(form)
</pre>
   </li>
   <li>在表单验证后,您需要提供成功的 URL,以进行重新定向;这应该是原来的博客。为此,您需要覆盖 <code>get_success_url()</code>,并为原来的博客 “反转” URL 。您可以使用<code>self.kwargs</code>属性,获取所需的博客ID,如上面的 <code>form_valid()</code> 方法所示。</li>
  </ul>
 </li>
</ol>

<p>我们简要地讨论了在<a href="/zh-CN/docs/Learn/Server-side/Django/Generic_views#Overriding_methods_in_class-based_views">Django教程 6:通用列表和详细信息视图</a>主题中,在基于类的视图中,将上下文传递给模板。要执行此操作,您需要覆盖<code>get_context_data()</code>(首先,获取现有上下文,使用要传递给模板的任何其他变量,更新它,然后返回更新的上下文)。例如,下面的代码片段,显示了如何根据<code>BlogAuthor</code> id,将 blogger 对象添加到上下文中。</p>

<pre class="brush: python">class SomeView(generic.ListView):
    ...

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(SomeView, self).get_context_data(**kwargs)
        # Get the blogger object from the "pk" URL parameter and add it to the context
        context['blogger'] = get_object_or_404(BlogAuthor, pk = self.kwargs['pk'])
        return context
</pre>

<h2 id="评估">评估</h2>

<p>这个任务的评估,可以在<a href="https://github.com/mdn/django-diy-blog/blob/master/MarkingGuide.md">Github</a>上找到。此评估主要基于您的应用程序,满足上面列出要求的程度,尽管评估的某些部分,会检查您的代码是否使用了适当的模型,并且您至少编写了一些测试代码。完成后,您可以查看我们<a href="https://github.com/mdn/django-diy-blog">完成的示例</a>,该示例项目的表现是 “满分”。</p>

<p>完成本单元后,表示您还完成了所有 MDN 用于学习《基本 Django 服务器端网站编程》的内容!我们希望您喜欢这个模块,并感觉您已经掌握了基础知识!</p>

<p>{{PreviousMenu("Learn/Server-side/Django/web_application_security", "Learn/Server-side/Django")}}</p>

<p> </p>

<h2 id="本系列教程">本系列教程</h2>

<ul>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Introduction">Django 介绍</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/development_environment">架设 Django 开发环境</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Tutorial_local_library_website">Django 教程: 本地图书馆网站</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/skeleton_website">Django 教程 2: 创建骨架网站</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Models">Django 教程 3: 使用模型</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Admin_site">Django 教程 4: Django 管理站点</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Home_page">Django 教程 5: 创建主页</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Generic_views">Django 教程 6: 通用列表与详细视图</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Sessions">Django 教程 7: 会话框架</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Authentication">Django 教程 8: 用户认证与授权</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Forms">Django 教程 9: 使用表单</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Testing">Django 教程 10: 测试 Django 网页应用</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/Deployment">Django 教程 11: 部署 Django 到生产环境</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/web_application_security">Django 网页应用安全</a></li>
 <li><a href="/en-US/docs/Learn/Server-side/Django/django_assessment_blog">DIY Django 微博客</a></li>
</ul>

<p> </p>