2016-06-21 4 views
0

Im Wesentlichen versuche ich, die Notwendigkeit zu beseitigen, die ID einer 'Auflistung' für den Benutzer anzuzeigen. Ich verwende Hashids, um die automatisch erstellte ID als eindeutigen Code zu codieren.Codierungs-ID und speichern Sie es als eindeutigen Code und speichern in Tabelle bei der Erstellung der Zeile

einen einzigen Eintrag anzuzeigen, ich habe dies zur Zeit getan:

@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) 

und das funktioniert für einen einzelnen Eintrag in Ordnung. Allerdings, wenn ich mehrere Angebote wie diese angezeigt werden wollte:

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

Ich kann nicht liefern die eindeutige ID für jeden Eintrag der jinja2 Vorlage (und sehen nicht, einen Weg zu kodieren/dekodieren ids in der jinja template selbst ... ist da?)

Ich möchte schließlich den eindeutigen Code in der Datenbank speichern, bin aber verwirrt, wie man das Hash - basierend auf der ID des Eintrags erstellt - wenn ich ' Ich erstelle dieses Listing selbst und kenne die ID nicht.

Ich bin gerade dabei einen Eintrag wie folgt aus:

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

ich später diese für die Validierung mit WTForms nutzen möchten bin.

Wie kann ich den eindeutigen Code in die Erstellung eines Eintrags einfügen, ohne die ID selbst zu kennen ???

Jede Hilfe wird sehr geschätzt !!!

+1

Ich denke, Sie sind für Ihre Modelle peewee mit? Wenn peewee klassenbasierte Modelle unterstützt, können Sie eine Funktion/Eigenschaft für die Hash-ID im Modell selbst verwenden. Sonst kannst du auch Funktionen in die Jinja-Vorlage einfügen, denke ich. – syntonym

Antwort

1

Innerhalb Ihres Listing Modell, könnten Sie eine Funktion definieren, wie zum Beispiel:

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

nun überall in Ihrem Jinja2 Vorlage, die Sie eine Instanz von Listing verwenden, können Sie listing.getHashId() rufen Sie die Hashid zurückzukehren die passende Auflistung in Frage. Auf diese Weise müssen Sie die Hash-ID auch nicht in der Datenbank speichern.

Sie könnten dann vereinfachen Ihre listing Funktion etwas wie folgt aus:

@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 
Verwandte Themen