2014-02-21 3 views
5

Hy Дружный, Я реализующая проект Колба/MongoDB и так как я новичок в этом мире, я следовал учебник на этой странице: http://docs.mongodb.org/ecosystem/tutorial/write-a-tumblelog-application-with-flask-mongoengine/Mongoengine, колб и ReferenceField в WTForms

После этого , я начал кодировать свое собственное приложение, и это часть кода:

МОДЕЛИ:

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} 
     ] 
    } 

Как вы можете видеть выше, у меня есть класс «Категория», который наследует «Generic " класс. Класс «Пользователь», наконец, имеет свойство ReferenceField для категории. Таким образом, когда я создаю пользователя, поле категории на mongo db хранится как ObjectID, относящееся к «общей» коллекции, в которой есть все категории, которые я создал.

Следующий шаг - создать форму для вставки новых документов в коллекцию пользователей. В моем файле Просмотров питона Я это 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) 

Шаблон использует макрос дзиндзя сообщается на странице учебника:

{% 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 %} 

И, наконец, это моя проблема (если вы достигли этого текста, вы мой герой)

Когда я посещаю веб-страницу с визуализированной формой, макрос правильно показывает текстовые поля, а для ссылочного поля в моей модели он показывает ac ombo box. Значения параметров в комманде select прекрасно совпадают с идентификатором объекта документов категории, которые я создал. Выбрав один из них и отправив форму, мое приложение правильно создает новый пользовательский документ.

К сожалению, ярлыки выбора окна не отображают значение для чтения человеком, сообщая «Объект категории».

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

Как я могу показать правильную метку для поля выбора?

ответ

3

Наконец-то я сделал это! Предположим, что поле «категоризация» документа пользователя является ссылочным элементом для коллекции «Категория». Просто добавьте атрибут «label_attr» в «form.categoria», используя имя поля модели Category, которое вы хотите как метку.

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

Это также может быть сделан через поле аргументы в функции model_form:

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

Может быть, его будет кому-то полезным. Вы можете использовать стандартный подход, как определить

def __str__(self): 
    return self.descrizione 

для категории класса

Смежные вопросы