编码id并将其作为唯一代码存储并存储在创建行的表中

问题描述:

本质上,我试图消除向用户显示“列表”的id的需要。我正在使用Hashids将自动创建的ID编码为唯一代码。编码id并将其作为唯一代码存储并存储在创建行的表中

要显示一个列表,我一直在目前这样做:

@app.route('/listing/<uniqueHash>') 
def listing(uniqueHash): 
    a = hashids.decode(uniqueHash) 
    listing = models.Listing.select().where(models.Listing.id == a).get() 
    uniqueHash = hashids.encode(listing.id) 
    return render_template("test1.html", listing = listing, uniqueHash = uniqueHash) 

,这工作得很好单个上市。但是,如果我想显示多个列表如下:

@app.route('/') 
def index(): 
    listings = models.Listing.select().limit(100) 
    return render_template("test.html", listings = listings) 

我再不能为每一个上市到的Jinja2模板提供的唯一ID(不明白的方式来编码的/解码IDS jinja模板本身...有没有?)

我最终希望将独特的代码存储在数据库中,但是我很困惑如何创建基于列表id的hashid - m创建该列表本身并不知道id。

我目前正在创建的列表如下:

form = request.form 
models.Listing.create(
    title = form['title'], 
    description = form['description'], 
    price = form['price'] 
) 

我打算以后用WTForms进行验证使用。

我如何最好在创建列表时包含唯一代码而不必知道id本身?

任何帮助非常感谢!

+1

我猜你正在使用peewee为您的模型?如果peewee支持基于类的模型,则可以在模型本身上使用函数/属性作为hashid。否则,你也可以将功能注入到我认为的jinja模板中。 – syntonym

在您Listing模型,你可以定义一个函数,例如:

def getHashId(self): 
    return hashid.encode(self.id) 

现在,在您使用的Listing实例您的Jinja2模板的任何地方,你可以调用listing.getHashId()返回hashid匹配上市问题。这样,您不需要将该hashid存储在数据库中。

然后,您可以简化您的listing功能是这样的:

@app.route('/listing/<uniqueHash>') 
def listing(uniqueHash): 
    try: 
     listing = models.Listing.select().where(models.Listing.id == hashid.decode(uniqueHash).get()) 
     return render_template("test1.html", listing=listing) 
    except: 
     #Listing with that uniqueHash does not exist