从SqlAlchemy_wtforms QuerySelectField获取ID值不值

时间:2019-11-16 19:16:46

标签: flask sqlalchemy flask-sqlalchemy

我一直试图在两个表之间建立关系,并有一个QuerySelectFiled从另一个表中选择一个字段,我设法做到了,但是当我想提交我不断获取的字段时出现了问题: / p>

InterfaceError: <unprintable InterfaceError object>

在调试问题后,我发现提交表单时,字段的值是提交的,而不是id,我通过在模型中说来解决了

self.firstAuthor = firstAuthor.id

解决了该问题,但是如果我选择一个空值,则该值将中断,因为空字段没有属性ID。

那么有人可以建议如何做吗?

这是我的表格:

from wtforms_alchemy import QuerySelectField, QuerySelectMultipleField
from ....module1.authors.author.authorModel import Author
from flask_wtf import FlaskForm
from wtforms import SubmitField, HiddenField, BooleanField, SelectField, StringField, FileField, IntegerField, DateTimeField
from datetime import datetime
from wtforms.validators import DataRequired

def getAuthor():
    return Author.query

class PublicationsForm(FlaskForm):
    id = HiddenField()
    title = StringField('Title', validators=[DataRequired()])
    category = SelectField('Category', choices=[('', ''),('Journal', 'Journal'), ('Conference', 'Conference'), ('Talk', 'Talk'),('Talk2', 'Talk2'),('Talk3', 'Talk3')])
    year = DateTimeField('Year', format='%Y')
    publisher = BooleanField('Publisher')
    volume = IntegerField('Volume')
    issue = IntegerField('Issue')
    pages = StringField('Pages')
    location = StringField('Location')
    note = StringField('Note')
    fullCitation = FileField('FullCitation')
    fullSource = FileField('FullSource')
    finalVersion = FileField('FinalVersion')
    firstAuthor = QuerySelectField("FirstAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    secondAuthor = QuerySelectField("SecondAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    thirdAuthor = QuerySelectField("ThirdAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    fourthAuthor = QuerySelectField("FourthAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    fifthAuthor = QuerySelectField("FifthAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    sixthAuthor = QuerySelectField("SixthAuthor", query_factory=getAuthor, get_label="lastName", allow_blank=True, blank_text='')
    submit = SubmitField("Save")

这是我的模特:

from sqlalchemy import Column, Integer, String, Boolean, DateTime
from app import db

class Publications(db.Model):
    id = db.Column(Integer, primary_key=True)
    title = db.Column(String, nullable=False)
    category = db.Column(String, nullable=False)
    year = db.Column(db.DateTime)
    publisher = db.Column(Boolean)
    volume = db.Column(Integer)
    issue = db.Column(String)
    pages = db.Column(String)
    location = db.Column(String)
    note = db.Column(String)
    fullCitation = db.Column(String)
    fullSource = db.Column(String)
    finalVersion = db.Column(String)
    issue = db.Column(db.Text)
    firstAuthor = db.Column(db.Integer, db.ForeignKey('author.id'))
    secondAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )
    thirdAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )
    fourthAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )
    fifthAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )
    sixthAuthor = db.Column(db.Integer, db.ForeignKey("author.id"),nullable=True )

    def __init__(self, title, category, year, publisher, volume, issue, pages, location, note, fullCitation, fullSource, finalVersion, firstAuthor, secondAuthor, thirdAuthor, fourthAuthor, fifthAuthor, sixthAuthor):
        self.title = title
        self.category = category
        self.year = year
        self.publisher = publisher
        self.volume = volume
        self.issue = issue
        self.pages = pages
        self.location = location
        self.note = note
        self.fullCitation = fullCitation
        self.fullSource = fullSource
        self.finalVersion = finalVersion
        self.firstAuthor = firstAuthor
        self.secondAuthor = secondAuthor
        self.thirdAuthor = thirdAuthor
        self.fourthAuthor = fourthAuthor
        self.fifthAuthor = fifthAuthor
        self.sixthAuthor = sixthAuthor

    def __repr__(self):
        return self.title

这是我的观点:

from flask import render_template, request, flash, redirect, url_for
from . import publications_blueprint
from .publicationsForm import PublicationsForm
from .publicationsModel import Publications
from app import db

@publications_blueprint.route("/publications", methods=["GET", "POST"])
def createPublications():
    form = PublicationsForm(request.form)
    publicationss = Publications.query.all()
    if request.method == "POST" and form.validate_on_submit():
        publications = Publications(form.title.data, form.category.data, form.year.data, form.publisher.data, form.volume.data, form.issue.data, form.pages.data, form.location.data, form.note.data, form.fullCitation.data, form.fullSource.data, form.finalVersion.data, form.firstAuthor.data, form.secondAuthor.data, form.thirdAuthor.data, form.fourthAuthor.data, form.fifthAuthor.data, form.sixthAuthor.data)
        db.session.add(publications)
        db.session.commit()
        flash("Added Publications Successfully")
        return redirect(url_for("publications.createPublications"))
    return render_template("publications/publications.html", title="Publicationss", form=form, publicationss=publicationss)

@publications_blueprint.route("/updatePublications/<int:publications_id>", methods=["GET", "POST"])
def updatePublications(publications_id):
    publications = Publications.query.get(publications_id)
    form = PublicationsForm(request.form, obj=publications)
    if request.method == "POST" and form.validate_on_submit():
        publications.title = form.title.data
        publications.category = form.category.data
        publications.year = form.year.data
        publications.publisher = form.publisher.data
        publications.volume = form.volume.data
        publications.issue = form.issue.data
        publications.pages = form.pages.data
        publications.location = form.location.data
        publications.note = form.note.data
        publications.fullCitation = form.fullCitation.data
        publications.fullSource = form.fullSource.data
        publications.finalVersion = form.finalVersion.data
        publications.firstAuthor = form.firstAuthor.data
        publications.secondAuthor = form.secondAuthor.data
        publications.thirdAuthor = form.thirdAuthor.data
        publications.fourthAuthor = form.fourthAuthor.data
        publications.fifthAuthor = form.fifthAuthor.data
        publications.sixthAuthor = form.sixthAuthor.data
        db.session.commit()
        flash("Updated Publications Successfully")
        return redirect(url_for("publications.createPublications"))
    publicationss = Publications.query.all()
    return render_template("publications/publications.html", title="Publications", form=form, publicationss=publicationss)

@publications_blueprint.route("/deletePublications/<int:publications_id>", methods=["GET", "POST"])
def deletePublications(publications_id):
    publications = Publications.query.get(publications_id)
    db.session.delete(publications)
    db.session.commit()
    return redirect(url_for("publications.createPublications"))

1 个答案:

答案 0 :(得分:0)

在类似情况下,我还在模型中将allow_blank=True用于QuerySelectField search_target 。我手动检查视图中是否选择了某些内容:

if formfilter.search_target.data:
   search_target = formfilter.search_target.data.id
else:                  
   ....