2015-04-28 48 views
1
  • 我有兩個表在一對多的關係,表項目有很多報告。
  • 當用戶輸入報告問題時,他/她必須從下拉列表中選擇該報告所屬的項目。
  • 下拉列表顯示項目名稱,但add_report()停止在db.session.commit(),當我打印_form.project_list.data_時,我得到項目名稱而不是外鍵。
  • 我相信我的問題是在表單中,我嘗試了很多代碼來獲取project_id,但我得到了「不可打印的InterfaceError對象」錯誤。
  • 我的問題: 我怎樣才能獲得項目ID數量,而不是從下拉列表中的項目名稱?

views.py平臺QueryselectField不通過編號

@app.route('/add_report/', methods=['GET', 'POST']) 
def add_report(): 
    form = AddReportForm(request.form) 
    if request.method == 'POST': 
     if form.validate_on_submit(): 
      new_report = Report(
       project_id=form.project_list.data, 
       issue=form.issue.data) 
      db.session.add(new_report) 
      db.session.commit() 
      flash('New report was successfully added.') 
      return redirect(url_for('projects')) 
     else: 
      flash('All fields are required.') 
      return redirect(url_for('projects')) 
    return render_template('project.html', form=form) 

Models.py

class Project(db.Model): 
    project_id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 
    date = db.Column(db.Date) 
    reports = db.relationship('Report', backref='project', lazy='dynamic') 

    def __repr__(self): 
     return self.name 

class Report(db.Model): 
    report_id = db.Column(db.Integer, primary_key=True) 
    project_id = db.Column(db.Integer, db.ForeignKey('project.project_id')) 
    issue = db.Column(db.Text) 

    def __repr__(self): 
     return self.issue 

forms.py

def get_projects(): 
    return Project.query 

class AddReportForm(Form): 
    project_list = QuerySelectField('Project', query_factory=get_projects) 
    issue = StringField('issue') 

非常感謝

回答

0

最後我發現有什麼錯我的代碼:)

  • 我使用PROJECT_ID(外鍵)報告表,以獲得該項目ID(form.project_list.data),而不是項目(關係)。所以我在models.py和views.py中做了一些修改。
    forms.py,我以爲是你的錯!

models.py

class Project(db.Model): 
    project_id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 
    date = db.Column(db.Date) 

    def __repr__(self): 
     return self.name 

class Report(db.Model): 
    report_id = db.Column(db.Integer, primary_key=True) 
    project_id = db.Column(db.Integer, db.ForeignKey('project.project_id')) 
    projects = db.relationship('Project', backref='report') 
    issue = db.Column(db.Text) 

    def __repr__(self): 
     return self.issue 

views.py

@app.route('/add_report/', methods=['GET', 'POST']) 
def add_report(): 
    form = AddReportForm(request.form) 
    if request.method == 'POST': 
     if form.validate_on_submit(): 
      new_report = Report(
       projects=form.project_list.data, 
       issue=form.issue.data) 
      db.session.add(new_report) 
      db.session.commit() 
      flash('New report was successfully added.') 
      return redirect(url_for('projects')) 
     else: 
      flash('All fields are required.') 
      return redirect(url_for('projects')) 
    return render_template('project.html', form=form) 

forms.py保持不變

0

舉報表?你的意思是下拉列表嗎?你試過

project_list = QuerySelectField('Project', query_factory=get_projects, get_label='project_id') 

檢查這個question減少您的查詢只選擇所需的列。

+0

謝謝你的回覆, 我試過* get_label ='project_id'*,我得到這個錯誤: sqlalchemy.exc。InterfaceError InterfaceError: Aseel

+0

是否顯示錶單並在提交表單上發生錯誤?如果可以,您是否可以在將其添加到數據庫之前先打印它並檢查您的form.project_list.data並確保獲得了project_id?我認爲你的問題是在表單顯示上,你可能不需要QuerySelectField中的get_label。 – bharani

+0

當調試add_report()函數到達db.session.commit()時停止。當我打印_form.project_list.data_時,我得到了像_Project 1_這樣的項目名稱,而不是外鍵! – Aseel