2009-11-23 92 views
3

我建立在Django标签系统,并希望允许标记名称空格和其他字符的显示,但它们过滤掉,并用小写匹配名称等Django的CharField至字符串

要当最后,我添加了一个外地到我的标签模型像这样:

class Tag(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    matchname = re.sub("\W+" , "", name.lower()) 

但是我遇到了一个问题,CharField不是字符串,我不能为我的生命找出如何将它转换成一个!

+2

啊...不能发布一个答案没有得到一个服务器错误:-( – 2009-11-23 11:53:53

+1

有一个加票,而不是!) – DavidM 2009-11-23 15:15:28

回答

6

您正在定义class,因此name不是字符串,而是Django Field

此外,在课堂上将name转换为matchname没有任何意义。你应该在实例上做这件事。

你可以添加一个方法,你的类要做到这一点:

def get_matchname(self): 
    """Returns the match name for a tag""" 
    return re.sub("\W+" , "", self.name.lower()) 
+1

有点像'def matchname(self):return re.sub(“\ W +”,“”,self。 name.lower())'(这是我将要放入我的回答,但今天stackoverflow讨厌我)。 – 2009-11-23 12:00:18

+0

@Dominic - 只是编辑答案来补充。 我也不断收到服务器错误;该网站不断记录我进出,我认为这是问题的根源。 – 2009-11-23 12:02:24

+0

+1 from me(代码示例中的docstrings?接下来!) – 2009-11-23 12:07:21

2

你可以添加一个方法:

class Tag(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    def get_matchname(self): 
     return re.sub("\W+" , "", name.lower()) 

而且使用property装饰:

class Tag(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    @property 
    def matchname(self): 
     return re.sub("\W+" , "", name.lower()) 

这一切将允许您访问name字段的小写字母,并删除非单词字符。但是你不会将它存储在数据库中。如果你想要这个,你需要添加另一个CharField并保持namematchname同步。

4

首先,您必须将字段定义为CharField,以便能够将其用于搜索。

class Tag(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    matchname = models.CharField(max_length=200, unique=True) 

然后你就可以覆盖保存功能模型来填充它是这样的:

class Tag(models.Model): 

    def save(self): 
     self.matchname = re.sub("\W+" , "", self.name.lower()) 
     super(Tag,self).save() 

或者使用的信号做同样的:

from django.db.models.signals import pre_save 

def populate_matchname(sender,instance,**kwargs): 
    instance.matchname = re.sub("\W+" , "", instance.name.lower()) 

pre_save(populate_matchname,sender=Tag)