django备忘

1. django注释

{#。。。。。#}

2. django过滤器

{{ name | lower }},将name变量的值转化成小写; {{ my_text|escape|linebreaks }}  ,转移文本为html,再转化每行到<p>

需要参数的过滤器:{{ bio|truncatewords:"30" }} 这个将显示变量 bio 的前30 个词。过滤器参数总是使用双引号标识。 

3. locals()


def method(request):

    now = datetime.datetime.now()

    return render_to_response('index.html',locals())

    return render_to_response('index.html',{'time':now}) 两种写法都可以,locals() 将局部变量都组织成dict 格式,懒人专用

4. {{block.super}}获取父级页面对应标签内容

(1){%block title%}本页面的title,{{block.super}}{%endblock%}======》》》<title>本页面的title,父页面的title</title>

(2)一个页面中不要出现多个同名的block,否则模板引擎解析将混乱

5. {% extends 'base.html' %} 

(1)extends 标记只能放在最顶部,否则失效

(2)extends 后面跟:一个字符串或者是一个变量

(3)extends 对传入的模板名称,加载方式和get_template(),render_to_response()相同,都是以settings中TEMPLATES_DIRS 为前缀

6. MTV (区别于MVC模式)

 Django 关注模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。

在 MTV 开发模式中:  

M 代表模型(Model),即数据存取层。该层处理与数据相关的所有事务:如何存取如何确认有效性、包含哪些行为以及数据之间的关系等。   

T 代表模板(Template),即表现层。该层处理与表现相关的决定:如何在页面或其他类型文档中进行显示。   

V 代表视图(View),即业务逻辑层。该层包含存取模型及调取恰当模板的相关逻辑。可以把它看作模型与模板之间的桥梁。 

7. manage.py 常用命令

python manage.py validate 验证模型是否有错误

python manage.py sqlall books 查看生成的sql代码,sqlall 命令并没有在数据库中真正创建数据表,只是把 SQL 语句段打印出来

python manage.py syncdb 执行数据库同步,生成表结构

python manage.py runserver lcalhost:8080 启动django应用程序

8.django modles之添加,修改,删除数据

添加/更新一条数据: (1)实例化一个model类(2)调用该实例的save()方法,当二次调用save时,不会添加只会修改数据

获取一张表的所有数据:类名点objects.all()

模块的字符串表现(必须返回字符串):

class Author(models.Model):

    name = CharField(max_length=30)

   .................................................................

    def __str__(self):

        return self.name

删除一条或多条数据:

l1 = Author.objects.all()

l1.delete() 删除所有Author表数据,也可以获取单挑删除

9. django modles之objects数据管理器(数据筛选)

(1)equal

Author.objects.filter(name='kevin') 对应的sql语句是:select name,.... where name='kevin',为什么不用select *,而具体指明字段呢,在python界里有一信条:“ 明确比不明确来的好 ”

filter(name='kevin',[key=value])可以传多个类似的参数,相应会生成多个and 条件后查询

(2)__like, __in,__iexact, __exact,__contains,__gt,__gte,__lt,__lte,__startswith,__istartswith(sqlite中使用),__endswith,__iendswith(sqlite中使用),__range(start,end)

Author.objects.filter(name__contains='kevin') ==>select name,.... where name like '%kevin%'

Author.objects.filter(name__in=['kevin','miao']) ==>select name,.... where name in('kevin','miao')

Author.objects.filter(name__iexact='kevin')==>select name,.... where name like 'kevin')

Author.objects.filter(name__iexact='kevin')==>select name,.... where name = 'kevin')

Author.objects.filter(name__iexact='kevin')==>select name,.... where name like '%kevin%')

 

Entry.objects.filter(id__gt=4) ==> SELECT ... WHERE id > 4;

Entry.objects.filter(id__gte=4) ==> SELECT ... WHERE id >= 4;

Entry.objects.filter(id__lt=4) ==> SELECT ... WHERE id < 4;

Entry.objects.filter(id__lte=4) ==> SELECT ... WHERE id <= 4;

Entry.objects.filter(headline__startswith='Will') ==> SELECT ... WHERE headline LIKE 'Will%';

Entry.objects.filter(headline__endswith='Will') ==> SELECT ... WHERE headline LIKE '%Will';


start_date=datetime.date(2005,1,1)

end_date=datetime.date(2005,3,31)

Entry.objects.filter(pub_date__range=(start_date,end_date))

SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';

https://docs.djangoproject.com/en/dev/ref/models/querysets/#std:fieldlookup-exact

(3)双下划线的特殊使用(上下级关系)user(类)__user_id(属性)

class Test():

       id=models.IntergerField(primarykey=true)

       user = models.ForeignKey(User, core=True)

class User():

      user_id=models.IntergerField(primarykey=true)

      user_name=models.CharField(maxlength=500,null=True)

这样的话,我们在别处就可以通过Test.user_id来访问User的主键:

result=Test.objects.get(id=1)

result.user_id 是可以的

result.user.user_id也是可以的。

有一点比较奇怪,也是笔者不太明白的是,如果要在对Test对象进行查询的时候,对user_id进行限制的话,不能用点操作符了,而必须使用

双下划线,比如说要取user_id等于1的Test对象,则使用下面的语句:

Test.objects.filter(user__user_id=1)

分析可以发现,在查询的条件当中,所有的这种上下级的操作符都是双下划线,比如说__gt __lt __year __month 再到这里的user__user_id

(4)objects.get 获取单个对象

Author.objects.get(name='kevin') 如果结果集中有多个name=‘kevin’ 的数据,或者没有找到数据,将会抛出异常

(5)order_by 排序

Author.objects.all().order_by('name') ,‘ -name ’方序(desc)

可以在模型中定义内部类Meta,并指明ordering,缺省情况下将使用此排序:

def Author(models.Model):

    name = CharField(max_length=30)

    ................................................................

    def __str__(self):

        return self.name

    class Meta:

        ordering = ["name"] 

(6)限制返回的数据

Author.objects.all()[0] ===>> select name,.... from Author limit 1

10. model 层修改字段时如何同步到数据库

python manage.py syncdb 只能创建table,无法修改,即当model变动时,syncdb不能及时影响到数据库

解决办法:

(1)手动修改数据库

(2)进入数据库交互命令界面,进行alter操作

(3)使用django-evolution 的命令:

python manage.py evolve --hint --execute

安装方式: easy_install -U django_evolution

前提是安装了setuptools,并把Scripts目录添加到环境变量

11. django 之自定义模板

settings 中 TEMPLATE_DIRS 配置设置了Django 加载模板的目录列表。 要自定义Django 的管理模板,只需要拷贝 Django 发行版中的整个管理模板到你在 TEMPLATE_DIRS里设置的模板目录里。 管理站点的头部区域在模板 admin/base_site.html 里。缺省情况下,这个模板在 Django管理模板目录 django/contrib/admin/templates 里,你可以在Django 的安装 目录找到它,例如Python 的 site-packages 目录或者你安装的其他目录。要自定义 这个 base_site 模板,把这个模板拷贝到你的模板目录下的 admin 子目录。 例如,假定你的模板目录是 "/home/mytemplates" ,拷贝 django/contrib/admin/templates/admin/base_site.html 到 /home/mytemplates/admin/base_site.html 。不要忘了有 admin 子目录。 然后,编辑这个新 admin/base_site.html 文件,替换你自己站点的名称上去。 备注 每个Django 缺省的管理模板都可以重载。要重载一个模板,就象 base_site.html 一样的去做:把它从缺省目录中拷贝到你自己的模板目录中然后修改它。

12. django 之urls配置技巧

##########################

from mybook.views import method1, method2, method3

urlpatterns = patterns('发现这里一般都是空的',
    (r'^m1/$', method1),
    (r'^m2/$', method2),
    (r'^m3/$', method3),

##########################
这种配置如果views过多会导致难于阅读和管理

##########################

#from mybook.views import method1, method2, method3

urlpatterns = patterns('mybook.views',
    (r'^m1/$', ‘method1’),
    (r'^m2/$', ‘method2‘),
    (r'^m3/$', ’method3’),

##########################

提取出一个公共视图前缀 mybook.views,不要在前缀后面跟着一个点号("." ),也不要在视图字符串前面放一个点号("." ), Django 会自动处理它们.

推荐使用这种方式,而且可以使用多个视图前缀 :

#from mybook.views import method1, method2, method3

urlpatterns = patterns('mybook.views',
    (r'^m1/$', ‘method1’),
    (r'^m2/$', ‘method2‘),
    (r'^m3/$', ’method3’),
)

urlpatterns += patterns('youbook.views',
    (r'^m1/$', ‘method1’),
    (r'^m2/$', ‘method2‘),
    (r'^m3/$', ’method3’),
)
django 框架寻找模块级别变量:urlpatterns,改变可以动态构建此处使用 “ += ”进行合并

利用动态构建urlpatterns技术,可以制作调试模式特例,如:

在urls中添加:

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^debuginfo$', 'mysite.views.debug'),
    )
只有在settings中设置DEBUG=True的时候,访问地址“debuginfo”才有效

##########################

URL 命名组方式

views.py 中:

def method1(year, month):

    pass

urls.py 中:

urlpatterns = patterns('mybook.views',

    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive),

    )

在 Python 正则表达式中,命名的正则表达式组的语法是 (?P<name>pattern) ,这里 name 是组的名字(参数名),而 pattern 是匹配的某个模式。 使用命名组可以让你的URLconfs 更加清晰,减少参数次序可能搞混的潜在 BUG。

如果我们想修改 URL 把月份放到 年份的 前面 ,而不使用命名组的话,我们就不得不去修改视图 month_archive 的参数次序。如果我们使用命名组的话,修改 URL 里提取参数的次序对视图没有影响

传递额外的参数到视图函数中

urlpatterns = patterns('',
    (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
    (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值