2015-08-04 1 views
1

Я хочу переопределить форму модели Matriline, показанной ниже.on_form_prefill удалять все значения полей, если он выполняет form.process

Сначала я добавляю дополнительное поле clan, а также в on_form_prefill Я сбрасываю выбор этого поля и по умолчанию (только тестирование).

Не вызывая form.process, у меня установлены новые параметры, но параметр по умолчанию не выбран.

Если вы звоните form.process, то на выбор устанавливаются мои новые параметры и выбирается опция по умолчанию, но все остальные поля удаляются.

Любой может помочь?

views.py

class MatrilineAdmin(sqla.ModelView): 

    form_extra_fields = { 
     'clan': SelectField('Clan', 
      coerce=int, 
      choices=[ (c.id, c.name) for c in Clan.query.all()]) 
    } 
    create_template = 'admin/create.html' 
    edit_template = 'admin/edit.html' 

    def on_form_prefill(self, form, id): 
     form.clan.choices = [(1, "first"),(2,"second")] 
     form.clan.default = 2 
     form.process() # if commented, set choices but does not set default 
         # else set choices and default but delete all the other fields values (name and pod_id) 

models.py

class Matriline(db.Model): 
    __tablename__ = 'matriline' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(64)) 
    calls = db.relationship('Call', backref='matriline', lazy='select') 
    pod_id = db.Column(db.Integer, db.ForeignKey('pod.id')) 

    def __unicode__(self): 
     return self.name 

    def __str__(self): 
     return self.name 


class Pod(db.Model): 
    __tablename__ = 'pod' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(64)) 
    matrilines = db.relationship('Matriline', backref='pod', lazy='select') 
    clan_id = db.Column(db.Integer, db.ForeignKey('clan.id')) 

    def __unicode__(self): 
     return self.name 
    def __str__(self): 
     return self.name 


class Clan(db.Model): 
    __tablename__ = 'clan' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(64)) 
    pods = db.relationship('Pod', backref='clan', lazy='select') 

    def __unicode__(self): 
     return self.name 
+2

http://stackoverflow.com/questions/28620219/setting-a-default-on-a-select -removes-the-settings-pass-in-to-populate-the-for – user2990084

+0

@ user2990084: С точки зрения WTForms ясно, что мы должны передавать конструкторы по умолчанию. При использовании flask_admin это иногда не является опцией, так как форма генерируется вверх и кэшируется. – zwirbeltier

ответ

0

Я решить эту проблему process_data

def on_form_prefill(self, form, id): 
    form.clan.choices = [(1, "first"), (2, "second")] 
    form.clan.process_data(2) 

Я надеюсь, что это может помочь вам

1

У меня есть очень похожие проблемы, и сделал его работу путем повторного обработки только изменившиеся поля. Также мне нужно передать текущее значение снова (иначе он будет всегда установлен по умолчанию):

from wtforms.utils import unset_value 

class CustomView: 
    def on_form_prefill(self, form, id): 
     form.clan.choices = [(1, "first"),(2,"second")] 
     form.clan.default = 2 
     form.clan.process(None, form.clan.data or unset_value) 

ПРИМЕЧАНИЕ: Как on_form_prefill вызывалась только в edit_view, а не в create_view это делает только работу с существующими экземплярами.

+0

Спасибо за это. Это решило мою проблему с переопределением edit_form для использования пользовательской формы. – ehambright

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

  • Нет связанных вопросов^_^