Django admin一对多及多对多内容过滤

2010-04-17 23:11:24 by sand, 954 visits, Tags: admin, Python, Django,

Django中admin是内置集成的管理后台,其中多对多及多对一关联有一个参数 limit_choices_to用来限制表单中的对应选项

目前可用的值只能是静态的例如:

limit_choices_to={'type':0}

代表限制只显示type=0的内容

假如碰到高级的过滤,例如我想只显示type和本对象type相等的,就没办法实现了,例如:

limit_choices_to={'type':self.type}是不可行的,因为这个代码是在类定义里,是没有self定义的
报错为:NameError: name 'self' is not defined

也许有人会想到用'self'.type,就类似自关联那种models.ForeignKey('self'),实际上这也是不行的
报错为:AttributeError: 'str' object has no attribute 'type',python把'self'当成普通字符串对象处理了

下面介绍一种可以达到你想要效果的办法,自定义表单:

代码大概的意思就是定义了Menu对象,并和自己关联,代表菜单可以有自己的上级菜单,但是在form里做了限制,在admin管理编辑页面中选择上级时将看不到自己,因为自己不能作为自己的上级
过滤目标对象id不等于当前对象id

class Menu(models.Model): title = models.CharField('title', max_length=50, unique=True)
    parentMenu = models.ForeignKey('self', verbose_name='parent menu',blank=True, null=True)

class MenuForm(forms.ModelForm): def __init__(self, *args, **kwargs):
        super(MenuForm, self).__init__(*args, **kwargs) if'instance'in kwargs:
            self.fields['parentMenu'].queryset = Menu.objects.exclude(id=kwargs['instance'].id)
class MenuAdmin(admin.ModelAdmin):
    model = Menu
     form=MenuForm
 

基本就是这样,描述的有点乱,不过真正碰到类似问题的人,应该可以看明白。

有问题请留言一定尽力解答。

 

评论 (2)        

Python集合容器类型之List用法

2010-04-14 19:07:04 by sand, 1722 visits, Tags: 数据类型, 集合容器, Python,

熟悉编程的人都知道,除了基本数据类型,最常用的就要数集合容器了,Python中集合容器类型有4种,分别是List,tuple,set,dict,下面详细介绍一下其中List的用法

  1. 定义及初始化生成List对象
    testList = []
    或者
    testList = ['a','b','c']
     
  2. 从List中取出对象,类似其他开发语言中的数组用法用listname[index],代表从前开始取第index个对象(第一个从0开始记),不同的是多了一种用负数取对象listname[-index],代表从后开始取第index个对象(第一个从-1开始记)
    testList[0]取出为a
    testList[-1]取出为c
    其实负数取法可以换算为:t
     
  3. 从List中截取部分对象生成新List:listname[fromIndex:toIndex]代表取出索引从fromIndex到toIndex,但不包括toIndex的元素,这个也叫做List的分片
    testList[0:2]取出从0开始到第2个元素但不包括testList[2],所以结果就相当于取出了testList[0]和testList[1]组合成的新List
    结果为['a','b']
    ‘:’两边的值可以省略,前面省略代表0,后面省略代表List长度
    testList[0:2]相当于testList[:2]
     
  4. 向List添加对象有3种方法
    1)向List后面添加一个对象:listname.add(obj)
    例:
    testList = ['a','b','c']
    testList.add('d')
    结果testList为['a','b','c','d']
    2)向List中间指定索引位置插入一个对象:listname.insert(index,obj)
    例:
    testList = ['a','b','c']
    testList.insert(2,'d')
    结果testList为['a','b','d','c']
    3)向List中添加一个List中的多个对象,相当于两个List相加:listname.extend(listname2)
    例:
    testList = ['a','b','c']
    testList2 = ['d','e']
    testList.extend(testList2)
    结果testList为['a','b','d','c','d','e']
     
  5. 判断某个对象是否在List中:obj in listname
    例:
    testList = ['a','b','c']
    'a' in testList结果为True
     
  6. 在List中搜索对象:listname.index(obj)
    注:如果List中存在多个相同obj,则返回的是首次出现的索引,如果List中不存在该对象会抛出异常,所以查找对象之前一定要先判断一下对象是否在List中,以免引起程序崩溃
    例:
    testList = ['a','b','c']
    testList.index('a')结果为0
     
  7. 删除List中的对象:listname.remove(obj)
    注:如果List中存在多个相同obj,则删除的是首次出现的对象,如果List中不存在该对象则会抛出异常,所以在删除之前也要判断对象是否在List中
    例:
    testList = ['a','b','c','a']
    testList.remove('a')
    结果testList为['b','c','a']
     
  8. 对List进行运算
    1)相加:listname1 + listname2
    注:结果为新生成一个List,并没有修改之前的两个List
    例:['a','b'] + ['c','d']结果为['a','b','c','d']
    2)倍数:listname*n
    例:['a','b']*2结果为['a','b','a','b']

基本常用方法就这些,如有问题请留言或直接联系我,一定尽力解答!

评论 (2)        

Python内置字符串操作处理方法详解

2010-04-12 19:45:26 by sand, 2174 visits, Tags: String, Python,

 Python字符串各种操作处理的内置方法详细解释如下: 

str='test Word tt'

  1. 生成字符串变量str='test Word tt'
     
  2. 字符串长度获取:len(str)
    例:print '%s length=%d' % (str,len(str))
     
  3. 字母处理
    全部大写:str.upper()
    全部小写:str.lower()
    大小写互换:str.swapcase()
    首字母大写,其余小写:str.capitalize()
    首字母大写:str.title()
    例:
    print '%s lower=%s' % (str,str.lower())
    print '%s upper=%s' % (str,str.upper())
    print '%s swapcase=%s' % (str,str.swapcase())
    print '%s capitalize=%s' % (str,str.capitalize())
    print '%s title=%s' % (str,str.title())
     
  4. 格式化相关
    获取固定长度,右对齐,左边不够用空格补齐:str.ljust(width)
    获取固定长度,左对齐,右边不够用空格补齐:str.ljust(width)
    获取固定长度,中间对齐,两边不够用空格补齐:str.ljust(width)
    获取固定长度,右对齐,左边不足用0补齐
    例:
    print '%s ljust=%s' % (str,str.ljust(20))
    print '%s rjust=%s' % (str,str.rjust(20))
    print '%s center=%s' % (str,str.center(20))
    print '%s zfill=%s' % (str,str.zfill(20))

  5. 字符串搜索相关
    搜索指定字符串,没有返回-1:str.find('t')
    指定起始位置搜索:str.find('t',start)
    指定起始及结束位置搜索:str.find('t',start,end)
    从右边开始查找:str.rfind('t')
    搜索到多少个指定字符串:str.count('t')
    上面所有方法都可用index代替,不同的是使用index查找不到会抛异常,而find返回-1
    例:
    print '%s find nono=%d' % (str,str.find('nono'))
    print '%s find t=%d' % (str,str.find('t'))
    print '%s find t from %d=%d' % (str,1,str.find('t',1))
    print '%s find t from %d to %d=%d' % (str,1,2,str.find('t',1,2))
    #print '%s index nono ' % (str,str.index('nono',1,2))
    print '%s rfind t=%d' % (str,str.rfind('t'))
    print '%s count t=%d' % (str,str.count('t'))

  6. 字符串替换相关
    替换old为new:str.replace('old','new')
    替换指定次数的old为new:str.replace('old','new',maxReplaceTimes)
    例:
    print '%s replace t to *=%s' % (str,str.replace('t', '*'))
    print '%s replace t to *=%s' % (str,str.replace('t', '*',1))

  7. 字符串去空格及去指定字符
    去两边空格:str.strip()
    去左空格:str.lstrip()
    去右空格:str.rstrip()
    去两边字符串:str.strip('d'),相应的也有lstrip,rstrip
    例:
    str=' test Word '
    print '%s strip=%s' % (str,str.strip())
    str='test Word'
    print '%s strip=%s' % (str,str.strip('d'))

  8. 按指定字符分割字符串为数组:str.split(' ')
    默认按空格分隔
    例:
    str='a b c de'
    print '%s strip=%s' % (str,str.split())
    str='a-b-c-de'
    print '%s strip=%s' % (str,str.split('-'))

  9. 字符串判断相关
    是否以start开头:str.startswith('start')
    是否以end结尾:str.endswith('end')
    是否全为字母或数字:str.isalnum()
    是否全字母:str.isalpha()
    是否全数字:str.isdigit()
    是否全小写:str.islower()
    是否全大写:str.isupper()
    例:
    str='test Word'
    print '%s startwith t=%s' % (str,str.startswith('t'))
    print '%s endwith d=%s' % (str,str.endswith('d'))
    print '%s isalnum=%s' % (str,str.isalnum())
    str='testWord'
    print '%s isalnum=%s' % (str,str.isalnum())
    print '%s isalpha=%s' % (str,str.isalpha())
    print '%s isupper=%s' % (str,str.isupper())
    print '%s islower=%s' % (str,str.islower())
    print '%s isdigit=%s' % (str,str.isdigit())
    str='3423'
    print '%s isdigit=%s' % (str,str.isdigit())

评论 (1)        

Python发送HTTP请求工具包httplib

2010-04-09 13:15:28 by sand, 2875 visits, Tags: HTTP, Python,

httplib是python的HTTP协议实现模块,内置在python库里面,通过httplib可以实现程序级的HTTP请求,与HTTP服务器进行交互,下面简单介绍一下使用方法:

  1. 导入httplib包
    import httplib
     
  2. 连接服务器
    conn = httplib.HTTPConnection('www.sandzhang.com')
     
  3. 发送HTTP协议GET请求
    conn.request('GET', '/')
     
  4. 获取结果(结果类型为httplib.HTTPResponse)
    result = conn.getresponse()
     
  5. 获取HTTP请求结果值,200为成功,具体其他值含义请查看HTTP协议内容
    resultStatus = result.status
     
  6. 获取请求到的结果内容
    resultContent = result.read()
     
  7. 关闭连接
    conn.close()

如果要模拟客户端进行请求,还可以在发送请求的时候携带头数据(HTTP header)

headers = {"Content-Type":"text/html; charset=gb2312"}
conn.request('POST', '/', headers=headers)

除了头数据,还可以在POST的时候带请求参数

params = urllib.urlencode({'pname':'pvalue'});
conn.request('POST', '/', body=params)

基本的一些使用方法就是这样,如果有不理解的或者想深入研究,可以在Python的库文件目录(Lib)查看httplib.py源代码

有问题也可以留言,一定尽力解答

评论 (2)        

« Newer Posts - Older Posts »