Welcome to the Treehouse Community

The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.

Python Flask with SQLAlchemy Basics Connecting to a Database with SQLAlchemy Working with a Plant Database

Take a minute to review the files in this challenge. For this task, you'll need to add plants to the database. Inside of

Take a minute to review the files in this challenge. For this task, you'll need to add plants to the database. Inside of app.py, you have a form route and function. This is where you will add your submitted plants to your database. Inside of the given if statement (before the return redirect()), you need to create a Plant object using the Plant() model and save it to a varaible called new_plant. Then add the plant to the database with db.add() and commit it with db.commit().

app.py
from models import db, Plant, app
from flask import render_template, url_for, request, redirect


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/form', methods=['GET', 'POST'])
def form():
    if request.form:
        new_plant = Plant (type=request.form['type'],
                           status=request.form['status'])        
        db.add(new_plant)
        db.commit()
        return redirect(url_for('index'))
    return render_template('form.html')


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)
models.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///plants.db'
db = SQLAlchemy(app)

class Plant(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    plant_type = db.Column(db.String())
    plant_status = db.Column(db.String())
form.html
{% extends 'layout.html' %}

{% block content %}
    <form action="{{ url_form('form') }}" method="POST">
        <label for="type">Plant Type:</label>
        <input type="text" name="type" id="type" placeholder="Plant type">

        <p>Plant Status:</p>
        <label for="good">GOOD</label>
        <input type="radio" name="status" id="good">
        <label for="ok">OK</label>
        <input type="radio" name="status" id="ok">
        <label for="bad">BAD</label>
        <input type="radio" name="status" id="bad">
    </form>
{% endblock %}
index.html
{% extends 'layout.html' %}

{% block content %}
    <h1>Our Plants:</h1>
    <div>
        <h2>Plant Type</h2>
        <p>Plant Status</p>
    </div>
{% endblock %}

Hey Hanwen Zhang!

I had the same problem as well. So one thing I noticed.

1) Inside of the "if statement" in your def form() function I believe you're misreferring both objects inside of the Plant() model in order to properly assign your new variable new_plant as they should be specified directly in reference. Simply put, you should change both of your objects from type and status to plant_type and plant_status (refer to models.py class method).

Overall, I think your app.py file should look something like this..

from models import db, Plant, app
from flask import render_template, url_for, request, redirect


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/form', methods=['GET', 'POST'])
def form():
    if request.form:
        new_plant = Plant(plant_type=request.form['type'], 
                          plant_status=request.form['status'])
        db.add(new_plant)
        db.commit()
        return redirect(url_for('index'))
    return render_template('form.html')

@app.route('/delete')
def delete():
    return redirect(url_for('index'))


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)