Showing posts with label django. Show all posts
Showing posts with label django. Show all posts

Wednesday, August 06, 2008

Django ORM 中ForeignKey生成sql的方式

django根据model的name按照字母序升序排序, 然后依次生成sql, 例如有model A, B, C, 此时A外键引用B, C外键引用B, 则生成的sql即为:
create table app_a(...)
create table app_b(...)
create table app_c(...reference app_b(...))
alter table app_a add foreign key fkey_name reference app_b(...))

Tuesday, July 29, 2008

urls中pattern可以简写

from django.conf.urls.defaults import *

urlpatterns = patterns('',
(r'^$', "main.views.index"),
(r'^contact-us/$', "main.views.contact_us"),
)

可以简写为:
from django.conf.urls.defaults import *

urlpatterns = patterns('main.views',
(r'^$', "index"),
(r'^contact-us/$', "contact_us"),
)
pattern的第一个参数是一个前缀

Sunday, July 13, 2008

重写django的FilterSpec来实现filter tag的数据自定义

重写django的FilterSpec来实现filter tag的数据自定义, 注意FilterSpec的register始终将新加的test function和factory的tuple放到registered list的最后, 但是当FilterSpec查找model匹配的FilterSpec的时候是顺序遍历的, 所以当在FilterSpec中只要有一个test function返回True, 那么model就用这个, 就是说model一直用第一个匹配的FilterSpec, 所以就有了下边的insert_first_filter_spec.

from django.contrib.admin.filterspecs import FilterSpec

def insert_first_filter_spec(test,factory):
FilterSpec.filter_specs.insert(0,(test,factory))

class AdvancedChoicesFilterSpec(FilterSpec):
def __init__(self, f, request, params, model):
super(AdvancedChoicesFilterSpec, self).__init__(f, request, params, model)
self.lookup_kwarg = '%s__exact' % f.name

make models's field default value to default filter
self.lookup_val = request.GET.get(self.lookup_kwarg, None) or self.field.default

def choices(self, cl):
yield {'selected': self.lookup_val is None,
'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
'display': _('All')}
for k, v in self.field.choices:
yield {'selected': str(k) == self.lookup_val,
'query_string': cl.get_query_string({self.lookup_kwarg: k}),
'display': v}

replace choices tag factory
insert_first_filter_spec(lambda f: bool(f.choices), AdvancedChoicesFilterSpec)

Friday, July 11, 2008

"ago filter" / date tag filter - django snippet

from django import template
from StringIO import StringIO

register = template.Library()

@register.filter_function
def date_tag(path, tags):
"""
{{ "/recent/"|date_tag:"0,1,2,3" }}
"""
html = StringIO()
if path:
path = path.strip()
else:
path=""
tags = [x.strip() for x in tags.split(',')]
for tag in tags:
if tag == "0":
html.write('<a href="%s%s/">%s</a><br>' % (path,tag,"today"))
elif tag == "1":
html.write('<a href="%s%s/">%s</a><br>' % (path,tag,"yesterday"))
else:
html.write('<a href="%s%s/">%s</a><br>' % (path,tag,tag+" days ago"))
return html.getvalue()

===================================
usage:
1. put this code to app/templatetags directory, named tags.py
2. load tags into template: {% load tags %}
3. use filter