2016-06-21 39 views
0

本質上,我試圖消除向用戶顯示「列表」的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

回答

1

在您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 
相關問題