我的django之旅(四)模型,模板和视图

时间:2023-03-08 22:01:55

一.结合模型,视图和模板

1.数据和模板结合

基本工作流程:

(1)在views.py文件中导入我们创建的models

(2)在视图函数中使用models,进行crud操作。

(3)将取得的数据存入template的上下文

(4)在template中给我们的数据找好位置,渲染它们。

2.初探模板语言

{% if %}

{% endif %}

if语句,和普通使用的不同在于必须用{% %} 包裹,而且当结束时有一个{% endif %}

{% for %}

{% endfor %}

for语句同理亦然。

{{data}},在两层大括号的包裹中,存放的是数据,可以通过if,for等分支,循环语句,将list中的数据取出来。

3.如何设计URL

我们的rango应用下有许多的页面,url的名称设计也是一个颇为重要的任务。如果url过于模糊,例如/rango/1或者/rango/2可能连我们自己都会不知所云。如果在url上添加页面的相关信息就好的多了,比如/rango/python,这是一个和python相关的页面。

并且python是从数据库中取出的相关字段。那么一个字段有空格又怎么办呢?比如

python framework。这就需要用到slug字段了。它会将python framework转换成python-framework.

3.Slug

首先引入slugify函数

from django.template.default.defaultfilters import slugify

在model中添加slug字段

slug=models.SlugField(unique=True)

重写save函数

ef save(*args,**kwargs):
self.slug=slugify(self.name)
super(<model-name>,self).save(*args,**kwargs)

4.注意事项

由于我们设置的slug是一个必须的(unique)值,如果要对model的改动迁移,会报如下的错误:

Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py

解决方案:选择1,输入' '即可,这表示将字段默认值设置为空字符串,但是接下来的步骤还是会报错

django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug

解决方案详细:http://*.com/questions/29373887/django-db-utils-integrityerror-unique-constraint-failed-rango-category-new-sl

给slug字段添加一个默认值uuid,还是失败

真-解决方案:

http://www.cnblogs.com/FARAMIR/p/4632355.html

由此可见,教程也不是完全正确,必须要不断的折腾才行。

PS:mysql就是比sqlite好用。

5.详细页面

我们的首页只有分类,点击分类后才进入详细页面。详细页面显示的就是page的信息,所以要引入page的model

要进入详细页面,势必要设置url

url设置如下:

url(r'^category/(?P<category_name_slug>[\w\-]+)/$', views.category, name='category')

?P<category_name_slug>代表将这个值作为参数传入到category这个视图函数中,后面的正则表达式[\w\-]+代表匹配slug值

在视图函数中要接收这个值的话就要新增参数

def category(request,category_name_slug)

因为已经设置slug值为unique,所以通过slug值我们可以找到唯一的Category对象,通过这个对象再找到page对象们。将信息存入context_dict{},在模版中渲染数据即可