烧瓶上的slu field字段

问题描述 投票:3回答:5

我想创建一个存储在数据库中的slug字段。

我搜索了一下,发现http://flask.pocoo.org/snippets/5/,但是在我的应用程序中集成代码时遇到了问题。

这是我的modele.py

from unicodedata import normalize


def slugfy(text, encoding=None,
        permitted_chars='abcdefghijklmnopqrstuvwxyz0123456789-'):
    if isinstance(text, str):
        text = text.decode(encoding or 'ascii')
    clean_text = text.strip().replace(' ', '-').lower()
    while '--' in clean_text:
        clean_text = clean_text.replace('--', '-')
    ascii_text = normalize('NFKD', clean_text).encode('ascii', 'ignore')
    strict_text = map(lambda x: x if x in permitted_chars else '', ascii_text)
    return ''.join(strict_text)


class Chanteur(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    nom = db.Column(db.String(200), index = True, unique = True)
    slug = db.Column(db.String(255))
    chanteurs = db.relationship('Chanson', backref = 'chanteur', lazy = 'dynamic')

    def __repr__(self):
        return '<Chanteur %r>' % (self.nom)

    def __setattr__(self, key, value):
        super(Chanteur, self).__setattr__(key, value)
        if key == 'nom':
            self.slug = slugfy(self.nom)


class Chanson(db.Model):
        id = db.Column(db.Integer, primary_key = True)
        titre = db.Column(db.String(255))
        chanteur_id = db.Column(db.Integer, db.ForeignKey('chanteur.id'))

        def __repr__(self):
            return '<Chanson %r>' % (self.titre)

它不起作用:当我添加一个新对象(chanteur)时,slug字段为空

python flask slug
5个回答
12
投票

为了坚持数据库中的slug,我使用以下方法(使用非常有用的python-slugify库):

from slugify import slugify  # among other things

class Song(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(255))
    slug = db.Column(db.String(255))

    def __init__(self, *args, **kwargs):
        if not 'slug' in kwargs:
            kwargs['slug'] = slugify(kwargs.get('title', ''))
        super().__init__(*args, **kwargs)

2
投票

对qazxsw poi建议的小改进,使用qazxsw poi你可以

@berislav-lopac

这将在create \ update上更新slug的列内容

如果你想要一个更好的解决方案,你可以使用@hybrid_property装饰器建议python-slugify


1
投票

安装名为from slugify import slugify class SlugModel(Base): name = Column(String) slug = Column(String) @staticmethod def slugify(target, value, oldvalue, initiator): if value and (not target.slug or value != oldvalue): target.slug = slugify(value) event.listen(SlugModel.name, 'set', SlugModel.slugify, retval=False) 的包,它使slugification成为一块蛋糕。

here

有关更多信息,请参阅Webhelpers


0
投票

健康

你可以这样做,如果你想要slug字段代表le titre de la Chanson。

from webhelpers.text import urlify


class Chanteur(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nom = db.Column(db.String(200), index=True, unique=True)
    chanteurs = db.relationship('Chanson', backref='chanteur', lazy='dynamic')

    def __repr__(self):
        return '<Chanteur %r>' % (self.nom)

    @property
    def slug(self):
        return urlify(self.nom)


class Chanson(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    titre = db.Column(db.String(255))
    chanteur_id = db.Column(db.Integer, db.ForeignKey('chanteur.id'))

    def __repr__(self):
        return '<Chanson %r>' % (self.titre)

    @property
    def slug(self):
        return urlify(self.nom)

slu g方法是从docs抓住的

编辑

from unicodedata import normalize


def slug(text, encoding=None,
         permitted_chars='abcdefghijklmnopqrstuvwxyz0123456789-'):
    if isinstance(text, str):
        text = text.decode(encoding or 'ascii')
    clean_text = text.strip().replace(' ', '-').lower()
    while '--' in clean_text:
        clean_text = clean_text.replace('--', '-')
    ascii_text = normalize('NFKD', clean_text).encode('ascii', 'ignore')
    strict_text = map(lambda x: x if x in permitted_chars else '', ascii_text)
    return ''.join(strict_text)



class Chanson(object):

    titre = ''
    slugfield = ''

    def __setattr__(self, key, value):
        super(Chanson, self).__setattr__(key, value)
        if key == 'titre':
            self.slugfield = slug(self.titre)

m = Chanson()
m.titre = 'Non, je ne regrette rien'
print m.titre
print m.slugfield

-2
投票

在上面的slug函数中,你需要做循环

here

将它减少到允许的字符后。如果你不这样做:def slug(text): #slugfy logic here class Chanson(db.Model): id = db.Column(db.Integer, primary_key = True) titre = db.Column(db.String(255)) chanteur_id = db.Column(db.Integer, db.ForeignKey('chanteur.id')) slugfield = db.Column(db.String(255)) def __setattr__(self, key, value): super(Chanson, self).__setattr__(key, value) if key == 'titre': self.slugfield = slug(self.titre) 将作为clean_text.replace('--', '-') 返回。

© www.soinside.com 2019 - 2024. All rights reserved.