簡體   English   中英

Flask-WTForm-以NoneType而不是String的形式獲取表單數據

[英]Flask - WTForm - Get Form Data as NoneType as opposed to String

為了解決這個問題,我已經搜索了一段時間。

我正在研究概念證明,一個簡單的輸入輸出數據輸入應用程序。

但是,我正在使用的Form不會輸出我的NoneType值,因為我正在嘗試使用filters來這樣做,如以下stackoverflow線程中所示: 從Fields數據中獲取None而不是空字符串

但是結果並不理想,因為我仍然只接收字符串。

我的表格

class MyForm(Form):
    event_date = DateField('Event Date:', format='%Y-%m-%d', validators=[DataRequired()], filters=[lambda x: x or None])
    person = StringField('Person', filters=[lambda x: x or None])
    office = QuerySelectField(query_factory=get_all_offices, allow_blank=True,
                              filters=[lambda x: x or None])
    event_type = QuerySelectField(query_factory=get_all_event_types, allow_blank=True, filters=[lambda x: x or None])
    submit = SubmitField('Search')

渲染

@app.route('/myform', methods=['GET', 'POST'])
def myform():
    if request.method == 'GET':
        form = MyForm()
        return render_template('my_form.html', form=form)
    else:
        print(request.form)
        context = {}
        event_date = request.form['event_date']
        office = request.form['office']
        person = request.form['person']
        event_type = request.form['event_type']
        print(person)
        print(event_date)
        print(type(office))
        print(event_type)

輸入

在此處輸入圖片說明

輸出

在此處輸入圖片說明

如您所見,辦公室和事件類型作為字符串對象進入,值為“ __None”。

有什么想法可以讓表格處理'''__None'到內置NoneType嗎?

編輯:人員/辦公室架構


class Person(Base):
    __tablename__ = 'people'

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), nullable=False)
    political_party = Column(String(64), nullable=False)
    ap_candidate_id = Column(String(64), nullable=False)

    def __repr__(self):
        return self.name


class Office(Base):
    __tablename__ = 'offices'

    id = Column(Integer, primary_key=True, autoincrement=True)
    desc = Column(String(64), nullable=False)

    def __repr__(self):
        return self.desc


class Event(Base):
    __tablename__ = 'events'

    id = Column(Integer, primary_key=True, autoincrement=True)
    event_date = Column(DateTime, nullable=False)
    office_id = Column(Integer, ForeignKey(Office.id))
    office = relationship('Office', backref='events')
    winner_id = Column(Integer, ForeignKey(Person.id))
    winner = relationship('Person', foreign_keys=winner_id, backref='events_won')
    loser_id = Column(Integer, ForeignKey(Person.id))
    loser = relationship('Person', foreign_keys=loser_id, backref='events_lost')
    event_type_id = Column(Integer, ForeignKey(EventType.id))
    event_type = relationship('EventType', backref='events')
    state_id = Column(Integer, ForeignKey(State.id))
    state = relationship('State', backref='state_events')

    def __repr__(self):
        return '{0} - {1}'.format(self.office, self.event_date)

你在做

print request.form['event_date']

所以基本上您只是在打印瀏覽器發布的數據。 您甚至都沒有使用創建的MyForm類。 您需要將request.form數據傳遞到MyForm類,以便它可以解析它。 然后使用您的MyForm類實例。

你需要做類似的事情

def myform():
    if request.method == 'GET':
        form = MyForm()
        return render_template('my_form.html', form=form)
    else:
        form = MyForm(request.form)
        if form.validate():
            print form.event_date.data
            print form.office.data
            print form.person.data
            print form.event_type.data

有關更多詳細信息,請瀏覽有關如何在視圖中處理表單的文檔

您的過濾器需要考慮到該值可能是字符串值"__None" ,當前您的過濾器只是在檢查該值是否不存在。 類似於以下內容的東西應該起作用(未經測試)。

 person = StringField('Person', filters=[lambda x: x or None, lambda x: None if x == '__NONE' else x])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM