2015-04-28 4 views
1
  • У меня есть две таблицы в отношениях один ко многим, в таблице Project есть много отчетов.
  • Пока пользователь вводит отчет, ему/ей придется выбрать проект, к которому относится этот отчет, из раскрывающегося списка.
  • В раскрывающемся списке указано имя проекта, но add_report() останавливается на db.session.commit(), а когда я печатаю _form.project_list.data_, я получаю название проекта вместо внешнего ключа.
  • Я считаю, что моя проблема в формах, я пробовал много кодов, чтобы получить project_id, но получил ошибку «unprintable InterfaceError object».
  • Мой вопрос: Как я могу получить имя проекта номер ID проекта вместо из выпадающего списка?

views.pyWtforms QueryselectField не проходит id

@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 (Foreign Key) в таблице отчета, чтобы получить идентификатор проекта (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

Отображается ли форма и появляется ошибка при отправке формы? Если вы можете проверить свою форму .project_list.data, распечатав ее перед добавлением в базу данных и убедитесь, что вы получили project_id? Я думал, что ваша проблема была на дисплее формы, вам, вероятно, не нужна get_label в QuerySelectField. – bharani

+0

При отладке функции add_report() функция останавливается, когда она попадает на 'db.session.commit()'. Когда я печатаю _form.project_list.data_, я получаю название проекта как _Project 1_ вместо внешнего ключа! – Aseel

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