2017-03-10 111 views
1

사용자가 검색 상자에 입력 한 값에서 "이름"및 "크기"값을 가져 오려고합니다.플라스크 - 값 가져 오기

하지만 명백한 문제는 method: "POST" hmtl 양식의 값을 얻으려고한다는 것입니다. 그리고 내 html 동작은 {{ url_for('main') }} html을 참조하며 {{url_for ('search')}} html에서이 값을 검색하지 않습니다.

import sqlite3 
from flask import Flask,render_template, url_for, redirect, request 


app = Flask(__name__) 
conn = sqlite3.connect('shoes.db', check_same_thread=False) 
c = conn.cursor() 

@app.route("/", methods=["GET", "POST"]) 
def main(): 

    if request.method == 'GET': 
     return render_template('main.html') 

    elif request.method == 'POST': 
     name = request.form.get('name') 
     size = request.form.get('size') 
     return redirect(url_for('search')) 


@app.route("/search/", methods=["GET", "POST"]) 
def search(): 

    # Need to get the 'name' and 'search' values from input, so this way is incorrect. 
    name = request.args.get("name") 
    size = request.args.get("size")  

    c.execute("SELECT * FROM shoes WHERE name LIKE ? AND sizes LIKE ? ORDER BY price", 
        ('%'+name+'%','%'+size+'%')) 

    p = c.fetchall() 

    url = [p[i][0] for i in range(len(p))] 
    names = [p[i][1] for i in range(len(p))] 
    prices = [p[i][2] for i in range(len(p))] 
    sizes = [p[i][3] for i in range(len(p))] 
    shoe_type = [p[i][4] for i in range(len(p))] 

    return render_template('search.html' , url=url, names=names, prices=prices, 
          sizes=sizes, shoe_type=shoe_type) 


if __name__ == '__main__': 
    app.run(debug=True) 

가 main.html :

{% extends "layout.html" %} 
{% block content %} 

<form action = "{{ url_for('main') }}" class="form" method = "POST" > 

     <h1>Soccer Shoes Finder</h1> 
     <div class="line-separator"></div> 

      <div class="container-fluid"> 
       <input name = "name" type="text" placeholder="Name"/> 
       <input name = "size" type="text" placeholder="Size"/> 
       <button class="glyphicon glyphicon-search" aria-hidden="true"></button> 
      </div> 

</form> 

{% endblock %} 

search.html에 :

{% extends "layout.html" %} 
{% block content %} 


    <div class= "container"> 
    <h2>Results:</h2> 
    <table class="table table-striped"> 
    <thead> 
    <tr> 
     <th>url</th> 
     <th>Name</th> 
     <th>Prices</th> 
     <th>Sizes</th> 
     <th>Shoe Type</th> 
    </tr> 
    </thead> 
    <tbody> 
    {% for i in range(url|length) %} 
    <tr> 
     <td><a href={{url[i]}}>aa</td> 
     <td>{{names[i]}}</td> 
     <td>${{prices[i]}}</td> 
     <td>{{sizes[i]}}</td> 
     <td>{{shoe_type[i]}}</td> 
    </tr> 
    {% endfor %} 
    </tbody> 
    </table> 
    </div> 
{% endblock %} 

누구든지 내가 이것을 어떻게 달성 할 수 알고

다음은 템플릿입니까? 바라건대 제가 말한 것이 의미가 있습니다. 감사.

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

POST 데이터 당신의 main.html 신사 내에서이 줄을 변경하여 검색 엔드 포인트 대신 직접 :

답변

2

여기에 데이터를 게시 할 이유가없는 것, 당신의 주요 경로를 단순화 템플릿 :

<form action="{{ url_for('search') }}" class="form" method="POST"> 

이 페이지를 렌더링 난 그냥 단지 POST 방법을 동의로 설정 거라고 가진 폼 데이터에 의존하지만,이 너에게 달렸다. request.form(또는 쿼리 문자열 GET 메서드도 지원하려는 경우 request.values)을 사용하여 여기 값에 액세스해야합니다. 데이터베이스 코드를 가정

@app.route("/search/", methods=["POST"]) 
def search(): 
    name = request.form.get("name") 
    size = request.form.get("size") 

+0

덕분에 예상대로이의 나머지 작업을해야 작동합니다. 이 작품. 아마 멍청한 질문이지만, 만약 main.html에서'redirect'를 삭제했다면, 검색 버튼을 클릭 할 때 어디로 리다이렉트 할 것인지 어떻게 알 수 있을까요? – tadm123

+0

'action' 속성의 형식은 ** main.html ** 페이지가 **/search/** 함수에 직접 양식을 제출하도록 지시합니다. – abigperson

+0

나는 이해합니다. – tadm123