2009-11-23 138 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)