Ich habe zwei Klassenmodelle, die in zwei MySQL-Datenbanktabellen übersetzt werden. Einer ist employees
und der andere ist projects
. Sie haben eine Eins-zu-Viele-Beziehung, d. H. Ein Projekt kann mehrere Mitarbeiter haben. In meinem Webformular bei der Registrierung eines Mitarbeiters habe ich ein Drop-down mit den Projekten. Tabelle employees
, hat einen Fremdschlüssel, der auf projects
Tabelle referenziert, und daher hat die employees
Tabelle eine Integer
Spalte (emp_project_id
) als Fremdschlüssel aus der projects
Tabelle. Wie speichere ich die ID, wenn ein Projekt aus dem Dropdown-Menü ausgewählt wird?So speichern Sie die ID des ausgewählten Dropdown-Wertes in SQLAlchemy
class Employee(UserMixin, db.Model):
"""
Create Employee table
"""
# Ensures table will be named in plural and not in singular
# as in the name of the model
__tablename__ = 'employees'
id = db.Column(db.Integer, primary_key=True)
emp_number = db.Column(db.String(10), index=True, unique=True, nullable=False)
username = db.Column(db.String(60), index=True, unique=True)
email = db.Column(db.String(60), index=True, unique=True, nullable=False)
emp_name = db.Column(db.String(100), index=True)
password_hash = db.Column(db.String(128))
emp_project_id = db.Column(db.Integer, db.ForeignKey('projects.id'), nullable=False)
Und hier ist die projects
Tabelle
class Project(db.Model):
"""
Create a Project table
"""
__tablename__ = 'projects'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(60), unique=True, nullable=False)
description = db.Column(db.String(200), nullable=False)
pro_subprojects = db.relationship('Subproject', backref='sp_project',
lazy='dynamic')
pro_employees = db.relationship('Employee', backref='emp_project',
lazy='dynamic')
verweisen mich freundlich auf eine Ressource, die ich auch durch, wenn möglich, gehen, da ich nicht die Lösung in ihrer Dokumentation gefunden haben.
ist die Klasse von forms.py
, die das Formular hier
class RegistrationForm(FlaskForm):
"""
Form for users to create new account
"""
project = QuerySelectField(query_factory=lambda: Project.query.all(),
get_label="name")
subproject = QuerySelectField(query_factory=lambda: Subproject.query.all(),
get_label="name")
emp_number = StringField('Employee Number', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired(), Email()])
username = StringField('Username', validators=[DataRequired()])
emp_name = StringField('Full Name', validators=[DataRequired()])
password = PasswordField('Password', validators=[
DataRequired(),
EqualTo('confirm_password')
])
confirm_password = PasswordField('Confirm Password')
submit = SubmitField('Register')
schafft das, was ich auf meinem views.py
hinzugefügt haben:
@auth.route('/register', methods=['GET', 'POST'])
def register():
"""
Handle requests to the /register route
Add an employee to the database through the registration form
"""
form = RegistrationForm()
if form.validate_on_submit():
employee = Employee(project=form.project.data,
subproject=form.subproject.data,
emp_number=form.emp_number.data,
email=form.email.data,
username=form.username.data,
emp_name=form.emp_name.data,
password=form.password.data)
# add employee to the database
db.session.add(employee)
db.session.commit()
flash('You have registered successfully. You can now log in.')
Wenn ich versuche jedoch einen Mitarbeiter zu registrieren, erhalte ich eine Fehler wie TypeError: 'project' is an invalid keyword argument for Employee
. Mit freundlicher
Folgen Sie diesem Tutorial? : https://scotch.io/tutorials/build-a-crud-web-app-with-python-and-flask-part-one –
Sicher. Ich folge diesem, obwohl ich etwas anderes entwickle –
sollten Sie alle Elemente aus HTML-Formular im Wörterbuch haben [flask.request.form] (http://flask.pooco.org/docs/0.12/quickstart/#the- Anfrage-Objekt) – furas