初学:投票教程(三)
从第四部分开始
# 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?