2011-11-01 44 views

回答

17

使用slugify模板過濾器,你可以通過在shell中的對象編寫腳本,或循環。

>>> from django.template.defaultfilters import slugify 
>>> for obj in MyModel.objects.all(): 
...  obj.slug = slugify(obj.title) 
...  obj.save() 
+0

我可以自動執行此操作嗎? –

+0

我不確定你的意思。上面的代碼片段將爲數據庫中的所有現有記錄設置段落。如果您想更新未來添加的所有記錄的slug,那麼您可以覆蓋save方法 - 例如,請參閱@ Tom的答案。 – Alasdair

+0

@感謝但是得到錯誤。 'NameError:名稱'實例'未定義' –

3

爲此,您可以在MySQL像這樣(代替你的表的名稱爲「表名」):

UPDATE `tableName` SET `slug`=LOWER(REPLACE(`title` , ' ' , '-')); 

這改變了遊戲,比如「這是一個標題「slu like」這是一個標題「。

編輯爲了處理括號,並刪除雙空間使用:

UPDATE `tableName` SET `slug`=LOWER(REPLACE(REPLACE(REPLACE(REPLACE(`title` , '(' , '') , ')' , '') , ' ' , ' ') , ' ' , '-')); 
+0

謝謝但我的標題也有'圓括號' –

+0

我編輯清除括號以及。您可以繼續嵌套REPLACE(),直到處理完所有目標字符。 –

+0

這太棒了,但我想要兩列像標題和類別slu g。那麼將會是什麼查詢。 –

3

我有一個方便的模型,我用於這些類型的東西的所有項目。我認爲這是一個如何做你想做的事情的好例子。

from django.template.defaultfilters import slugify 


class NameAndSlug(models.Model): 
    ''' 
    convenience model for things that are just names 
    ''' 
    name = models.CharField(max_length=200, unique=True) 
    slug = models.SlugField() 

    def __unicode__(self): 
     return self.name 

    def save(self, *args, **kwargs): 
     """ 
     Slugify name if it doesn't exist. IMPORTANT: doesn't check to see 
     if slug is a dupe! 
     """ 
     if not self.slug: 
      self.slug = slugify(self.name) 
     super(NameAndSlug, self).save(*args, **kwargs) 

    class Meta: 
     abstract = True 
+0

謝謝。爲什麼我得到這個錯誤? 'def __unicode __(self): IndentationError:unindent不匹配任何外部縮進級別' –

+0

檢查你的空白。你有太多或太少的空間嗎?你在混合製表符和空格嗎? – Alasdair