初学:投票教程(三)

从第四部分开始

#  app_name/templates/app_name/details.html

# 问题内容
<h1>{{ question.question_text }}</h1>
# 如果有错误信息,输出错误信息
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
# 如果点击投票后,执行的操作
<form action="{% url 'app_name:vote' question.id %}" method="post">
# 不知道什么东西
{% csrf_token %}
# 循环创建选项
{% for choice in question.choice_set.all %}
    # 圆形的选择项,choice_id???
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
    # 点击文本也可以选择选项
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
# 结束循环
{% endfor %}
# 提交,value???
<input type="submit" value="Vote">
</form>

这意味着,当有人选择一个单选按钮并提交表单提交时,它将发送一个 POST 数据choice=#,其中# 为选择的 Choice 的 ID。这是 HTML 表单的基本概念。

choice.id应该是投票的数量,那返回的value不就是已投票的数量吗?但还是很奇怪,首先,choice应该还是一个类,但是这个类并没有id的属性,如果说,奥,对了,id是choice的主键,懂了。

简而言之,所有针对内部 URL 的 POST 表单都应该使用`

`模板标签。

是与post有关的

11111111

重定向不是很难理解,但是首先它和直接返回一个网页的区别在于什么?是跳转吗?

11111111

{{ choice.votes|pluralize}}这是什么意思?还有vote again有点搞笑,如何一票制怎么办?这点也挺好玩的,可能数据库中要存储投票账号信息。

我们的 vote() 视图代码有一个小问题。代码首先从数据库中获取了 selected_choice 对象,接着计算 vote 的新值,最后把值存回数据库。如果网站有两个方可同时投票在 同一时间 ,可能会导致问题。同样的值,42,会被 votes 返回。然后,对于两个用户,新值43计算完毕,并被保存,但是期望值是44。

确实这个问题也很现实,而且如果显示44投票的人也会觉得很奇怪,因为自己只投了一票,当然他也能理解多人同时投票,但是那他就不知道是不是自己投票成功了呀!

11111111

通用视图:视图函数常用操作有 1)从数据库中导出数据 2)渲染模板 3)返回渲染结果

将原来的视图函数改为通用视图的步骤:

1、修改urlconf

2、修改视图

context_object_name是什么?传入模板的参数名

我感觉通用视图虽然看似可以减少代码数量,但是很大程度上限制了对于函数功能的自由构建,如果是工厂函数那当然可以用,如何是核心函数还是不能使用视图。

通用视图的功能需要好好看,这部分没完成不能继续!

11111111

五、测试(尽管这一部分我超级不想看,但是我还是会看!)

自动化测试与普通测试的区别,普通测试一般是指人在程序完成后手动输入参数,来观察结果是否与预期相同,一般这样的测试很直接,只针对某些细节,但范围覆盖小,也不可重复。自动化测试就是人为设置好一系列完整的测试范例,然后由系统完成测试,方便而且可以多次重复。

这里有几个问题,首先自动化测试的工具是什么?其次,测试成功或失败的条件也不可能很全面,也可能会有异常漏过。

按照惯例,Django 应用的测试应该写在应用的 tests.py 文件里。测试系统会自动的在所有以 tests 开头的文件里寻找并执行测试代码。

接着在命令行中运行,就会发现测试报错,然后修复bug后,测试成功

这个其实很白痴哎,首先测试用例根本不全面,只有一个30天之后的个例,而且如果知道这个错误肯定马上修改了呀,ok,这个不谈,完整的测试至少应该包括多个日期,这里其实可以选择循环一类的做法。

奥,后面增加了“全面”的测试。

但我还是很疑惑,这样的测试算是全面了吗?尽管他涉及到了过去,最近,将来,但是中间的空隙还是很大。

11111111

测试视图

启动服务器、在浏览器中载入站点、创建一些发布时间在过去和将来的 Questions ,然后检验只有已经发布的 Questions 会展示出来,

这是什么意思?测试还有自动筛选的功能?话说回来,自动化测试,也就应该是在代码发生修改以后进行测试的功能,但是前面的示例依旧不算是自动化,算吗?

接下来,它为视图编写了一个测试类,其中

这部分代码不了解

再接下来,因为发布时间在未来的问题虽然不会z爱目录页显示,但是也可以被用户通过url访问到,修改views.py来避免这种情况,并且写测试。

11111111

六、静态文件:网站图片、脚本、样式表

11111111

第七部分主要是关于自定义后台相关的内容#

这里关键是admin.site.register,用于管理后台字段的显示界面,如上代码使得字段pub_date在questiontext之前,也就是这里管理的是字段显示的先后顺序。

第一个是标题,第二个中的‘fields’是否可以修改呢?

111111111

choice的添加

方式一:使用admin.site.register

咦,这里的admin.site.register可以重复调用两次吗?不会有覆盖的问题吗?

方式二:

这是什么东西?

还有一种TabularInline,与StackedInline的区别是外观上更加紧凑

111111111

自定义后台更改列表,(这些django自带的后台管理做的真好用啊,功能也很强大!)

在选择question界面,每个question分别列出question_text, pubdate, was--这三个字段的信息。

另外,也可以在models文件中修改Question类,以优化在后台的表现,如下

这部分是如何优化的,以及表现如何,等实际操作时再详细了解一下。

这样在页面右方会出现一个筛选器,根据发布问题的日期。这里的list_filter应该与‘was_published_recently.admin_order_field = 'pub_date'有关系吧?

可以允许根据文本来查找问题

现在是给你的修改列表页增加分页功能的好时机。默认每页显示 100 项。变更页分页, 搜索框, 过滤器, 日期层次结构, 和 列标题排序 均以你期望的方式合作运行。

还有这么多!?不愧是有名的python web开发框架,功能真强大!

111111111

自定义后台界面风格

在manage.py同级的目录中,建立一个templates的目录

模板可放在你系统中任何 Django 能找到的位置。

对此,我深表怀疑啊,到底django是怎么找寻并且识别这些模板的?

在settings.py文件中添加DIRS选项

就像静态文件一样,我们 可以 把所有的模板文件放在一个大模板目录内,这样它也能工作的很好。但是,属于特定应用的模板文件最好放在应用所属的模板目录(例如 polls/templates),而不是工程的模板目录(templates)。我们会在 创建可复用的应用教程 中讨论 为什么 我们要这样做。

如果不清楚django运作的原理,是无法使用好这一工具的。

然后在templates目录中创建admin目录,然后将django的默认后台模板(django/contrib/admin/templates)复制到这里面。

替换其中的“{{site_header|default:_('Django administration')}}”(此处可能有误,需勘正)为站点的名字

我们会用这个方法来教你复写模板。在一个实际工程中,你可能更期望使用 django.contrib.admin.AdminSite.site\_header 来进行简单的定制。

这个模板文件包含很多类似 `

和的文本。{%{{` 标签是 Django 模板语言的一部分。当 Django 渲染 admin/base_site.html 时,这个模板语言会被求值,生成最终的网页,就像我们在 教程第 3 部分 所学的一样。

注意,所有的 Django 默认后台模板均可被复写。若要复写模板,像你修改 base\_site.html 一样修改其它文件——先将其从默认目录中拷贝到你的自定义目录,再做修改。

Last updated

Was this helpful?