【问题标题】:How to filter a table using dates but the user doesn't enter an 'end date' (CRUD Flask + SQLAlchemy)如何使用日期过滤表但用户没有输入“结束日期”(CRUD Flask + SQLAlchemy)
【发布时间】:2022-09-23 16:30:03
【问题描述】:

我创建了一个 CRUD flask web 应用程序来安排卡车预约。我有一个 HTML 表单,用户在其中输入开始和结束日期,网页显示该期间数据库中的约会。

对于用户只输入开始日期而不输入结束日期的情况,我想将“结束日期”设置为 2050-01-01,以便用户可以看到开始日期之后的所有约会。

我试图在我的 index() 视图函数中编写一个 if 语句,但我不知道正确的语法。这就是我想要做的伪代码

if the (end date).value.length = 0, then 
    end date = \'2050-01-01\'
else
    search_date_end = request.args.get(\'end_date_filter\')

应用程序.py:

@app.route(\'/\', methods=[\'GET\', \'POST\'])
def index():

search_date_start = request.args.get(\'start_date_filter\')
search_date_end = request.args.get(\'end_date_filter\')

appts = appts_db.query \\
    .filter(appts_db.pickup_date.between(search_date_start, search_date_end)) \\
    .order_by(appts_db.pickup_date).all()

return render_template(\'index.html\', appts=appts)

索引.html:

<h3>Appointment List:</h3>
    <table>
        <tr>
            <th>Carrier</th>
            <th>Material</th>
            <th>Pickup Date [YYYY-MM-DD]</th>
        </tr>

        {% for appt in appts %}
             <tr>
                 <td>{{ appt.carrier }}</td>
                 <td>{{ appt.material }}</td>
                 <td>{{ appt.pickup_date }}</td>
             </tr>
        {% endfor %}
    </table>

<form action=\"/\" method=\"GET\">
    <label for=\"start_date_filter\">Choose a start date:</label>
    <input type=\"date\" id=\"start_date_filter\" name=\"start_date_filter\" 
        min=\"2022-01-01\"><br>

    <label for=\"end_date_filter\">Choose an end date:</label>
    <input type=\"date\" id=\"end_date_filter\" name=\"end_date_filter\" 
        min=\"2022-01-01\"><br>

    <input type=\"submit\" value=\"Filter Appointments\">
</form>

    标签: python date flask filter sqlalchemy


    【解决方案1】:

    你是getting 来自request.args 字典的值。 因此,如果密钥不存在,您将拥有None。 在最终值上添加 if/else 应该足以满足您的需求。

    @app.route('/', methods=['GET', 'POST'])
    def index():
    
        search_date_start = request.args.get('start_date_filter')
        search_date_end = request.args.get('end_date_filter')
    
        
        if search_date_end is None:  # open ended
            query = (
                appts_db.query
                .filter(appts_db >= search_date_start)
                .order_by(appts_db.pickup_date)
            )
        else:  # close ended
            query = (
                appts_db.query
                .filter(appts_db.pickup_date.between(search_date_start, search_date_end))
                .order_by(appts_db.pickup_date)
            )
    
        return render_template('index.html', appts=query.all())
    

    使用新样式 select 声明 (>= 1.4) 它变得更加简单,因为只需要更改 filter

    @app.route('/', methods=['GET', 'POST'])
    def index():
    
        search_date_start = request.args.get('start_date_filter')
        search_date_end = request.args.get('end_date_filter')
    
        stmt = select(appts_db).order_by(appts_db.pickup_date)
    
        if search_date_end is None:  # open ended
            stmt = stmt.filter(appts_db >= search_date_start)
        else:  # close ended
            stmt = stmt.filter(appts_db.pickup_date.between(search_date_start, search_date_end))
    
        result = session.scalars(stmt)
    
        return render_template('index.html', appts=result.all())
    

    【讨论】:

      猜你喜欢
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多