编码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本身?
任何帮助非常感谢!
答
在您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
我猜你正在使用peewee为您的模型?如果peewee支持基于类的模型,则可以在模型本身上使用函数/属性作为hashid。否则,你也可以将功能注入到我认为的jinja模板中。 – syntonym