2014-02-21 11 views
5

Hy alle, Ich bin ein Fläschchen/MongoDB Projekt zu realisieren, und da ich auf dieser Welt bin hier, ich habe das Tutorial auf dieser Seite eintragen: http://docs.mongodb.org/ecosystem/tutorial/write-a-tumblelog-application-with-flask-mongoengine/Mongoengine, Flasche und ReferenceField in WTForms

Danach

MODELLE:

class Generic(db.Document): 
    descrizione = db.StringField(max_length=255, required=True) 

    meta = { 
     'allow_inheritance': True, 
     'indexes': [ 
      {'fields': ['descrizione'], 'unique': True} 
     ] 
    } 

class Category(Generic): 
    def __call__(self, *args): 
     pass 

class User(db.Document): 
    email = db.EmailField(max_length=255, required=True) 
    nickname = db.StringField(max_length=255, required=True) 
    password = db.StringField(max_length=16, required=True) 
    categoria = db.ReferenceField('Category', required=True) 

    meta = { 
     'indexes': [ 
      {'fields': ['nickname', 'email'], 'unique': True} 
     ] 
    } 

Wie Sie oben sehen können, habe ich eine „Kategorie“ Klasse, die die „Generic erbt, ich habe meine eigene Anwendung zu codieren, und dies ist Teil des Codes gestartet "Klasse. Die Klasse "Benutzer" verfügt schließlich über ein ReferenceField für die Kategorie. Auf diese Weise, wenn ich einen Benutzer erstelle, wird das Kategoriefeld auf Mongo Db als ObjectID gespeichert, bezogen auf die "generische" Sammlung, die alle Kategorien hat, die ich erstellt habe.

Der nächste Schritt besteht darin, das Formular zu erstellen, um neue Dokumente in die Benutzersammlung einzufügen. In meinen Ansichten Python-Datei habe ich diese cose:

def iscrizione(): 

    form = model_form(User, only=['email', 'nickname', 'password', 'categoria'])(request.form) 

    if request.method == 'GET': 
     ctx = { 
      'form': form 
     } 
     return render_template('users/iscrizione.html', **ctx) 

Die Vorlage verwendet das Makro Jinja in der Tutorial-Seite berichtet:

{% macro render(form) -%} 
<fieldset> 
{% for field in form %} 
{% if field.type in ['CSRFTokenField', 'HiddenField'] %} 
    {{ field() }} 
{% else %} 
    <div class="clearfix {% if field.errors %}error{% endif %}"> 
    {{ field.label }} 
<div class="input"> 
    {% if field.name == "body" %} 
    {{ field(rows=10, cols=40) }} 
    {% else %} 
    {{ field() }} 
    {% endif %} 
    {% if field.errors or field.help_text %} 
    <span class="help-inline"> 
    {% if field.errors %} 
     {{ field.errors|join(' ') }} 
    {% else %} 
     {{ field.help_text }} 
    {% endif %} 
    </span> 
    {% endif %} 
</div> 
</div> 
{% endif %} 
{% endfor %} 
</fieldset> 
{% endmacro %} 

Und schließlich, das ist mein Problem (If Sie haben diesen Text erreicht, Sie sind mein Held)

Wenn ich die Webseite mit dem gerenderten Formular besuche, zeigt das Makro korrekt die Textfelder an, und für das ReferenceField in meinem Modell zeigt es ac Ombo-Box. Die Optionswerte in der Auswahlkombination stimmen perfekt mit der Objekt-ID der von mir erstellten Kategoriedokumente überein. Wenn ich eines davon auswähle und das Formular abschicke, erstellt meine Anwendung das neue Benutzerdokument korrekt.

Leider zeigen die Auswahlfeldbeschriftungen keinen vom Menschen lesbaren Wert an und melden "Category object".

<select id="categoria" name="categoria"> 
    <option value="530536363c74031c24ee7ab6">Category object</option> 
    <option value="5305362d3c74031c24ee7ab5">Category object</option> 
    <option value="530535793c74031b73dd07b4">Category object</option> 
</select> 

Wie kann ich ein korrektes Etikett für die Auswahlbox anzeigen?

Antwort

3

Endlich habe ich es geschafft! Angenommen, das Feld "categoria" des Benutzerdokuments ist ein ReferenceField für die Sammlung "Category". Fügen Sie das Attribut "label_attr" zu "form.categoria" hinzu, indem Sie den Feldnamen des Category-Modells als Bezeichnung verwenden. Diesen

def iscrizione(): 
    form = model_form(User, only=['email', 'nickname', 'password', 'categoria'])(request.form) 
    form.categoria.label_attr='descrizione' #<< add this line 
    if request.method == 'GET': 
     ctx = { 
     'form': form 
    } 
    return render_template('users/iscrizione.html', **ctx) 
1

kann auch durch das Feld args in der model_form Funktion vorgenommen werden:

form = model_form(
    User, 
    only=['email', 'nickname', 'password', 'categoria'], 
    field_args={'categoria': {'label_attr': 'descrizione'}} 
) 
0

Vielleicht wird sein für jemanden nützlich sein. Sie können Standardansatz verwenden, definieren wie

def __str__(self): 
    return self.descrizione 

für Ihre Kategorie Klasse