主頁 > .NET開發 > 如何使用Python、Flask和SQLite3實作下拉選擇選項的動態依賴變化?

如何使用Python、Flask和SQLite3實作下拉選擇選項的動態依賴變化?

2021-12-27 10:23:55 .NET開發

再會。我對編程真的很陌生(3 個月),我正在嘗試為我的課程最終專案添加最后一個功能。在我的 html 頁面中,我有 5 個選擇容器,第一個容器在我的 app.py 中有來自元組物件的資料,其余 4 個選項資料來自 sqlite3 資料庫查詢。我希望這些選項相互依賴,無論用戶首先選擇哪個選項。為了讓您更多地了解我在說什么,所有選項都與武器型別相關(這是一個用于管理在線游戲庫存的網路應用程式),這個“型別”列存在于查詢中使用的每個表中,遠程武器表示為“1”,近戰武器表示為“2”,兩種型別均表示為“0”。那么我是如何理解它的,我需要在選擇一個選項后發出一個 json 請求,并將其與新的查詢結果一起回傳到 html,以便使用 javascript 處理新資料?但是接下來,當將選擇新選項并減少變體時……我完全迷失在這里,因為我的 javascript 經驗僅適用于引導程式(復制/粘貼)……我希望我清楚地解釋了所有內容,并且非常感謝一些例子如何做到這一點。感謝您的時間。

我的python代碼:

@app.route("/add", methods=["GET", "POST"])
@login_required
def add():
    
    # assigning user_id to session
    user_id = session["user_id"]
    
    # this will be used for future dynamic change feature
    weapon_type = ("-1", "1")
    
    if request.method == "POST":
        
        # assigning user's input
        wtype = request.form.get("wtype")
        wname = request.form.get("wname")
        main_p = request.form.get("main_p")
        major_p = request.form.get("major_p")
        minor_p = request.form.get("minor_p")
        
        # check if input fields are blank or not valid
        if not wtype or wtype not in weapon_type:
            return apology("Invalid type")
        if not wname:
            return apology("Invalid type")
        if not main_p:
            return apology("Invalid type")

        # adding new weapon into users_weapons table
        db.execute("INSERT INTO user_weapons (user_id, weapon_id, main_id, major_id, minor_id) VALUES(?, ?, ?, ?, ?)", user_id, wname, main_p, major_p, minor_p)
        
        return redirect("/inventory")
    
    else:
        
        # adding options for select forms
        weapons = db.execute("SELECT id, name FROM weapons")
        mains = db.execute("SELECT id, name FROM mainp")
        majors = db.execute("SELECT id, description FROM majorp")
        minors = db.execute("SELECT id, description FROM minorp")
        
        return render_template("add.html", weapons=weapons, mains=mains, majors=majors, minors=minors)

我的html代碼:

{% block main %}
    <form action="/add" method="post">
        <div class="form-group">
            <select class="form-control col-md-4 bg-dark text-success" name="wtype">
                <option disabled selected>Weapon Type</option>
                <option value="-1">Melee</option>
                <option value="1">Ranged</option>
            </select>
            <br>
            <br>
            <select class="form-control col-md-4 bg-dark text-success" name="wname">
                <option disabled selected>Weapon Name</option>
                {% for weapon in weapons %}
                    <option value="{{ weapon["id"] }}"> {{ weapon["name"] }} </option>
                {% endfor %}
            </select>
            <br>
            <br>
            <select class="form-control col-md-4 bg-dark text-success" name="main_p">
                <option disabled selected>Main Prefix *</option>
                {% for main in mains %}
                    <option value="{{ main["id"] }}"> {{ main["name"] }} </option>
                {% endfor %}
            </select>
            <br>
            <br>
            <select class="form-control col-md-4 bg-dark text-success" name="major_p">
                <option disabled selected>Major Prefix **</option>
                {% for major in majors %}
                    <option value="{{ major["id"] }}"> {{ major["description"] }} </option>
                {% endfor %}
            </select>
            <br>
            <br>
            <select class="form-control col-md-4 bg-dark text-success" name="minor_p">
                <option disabled selected>Minor Prefix ***</option>
                {% for minor in minors %}
                    <option value="{{ minor["id"] }}"> {{ minor["description"] }} </option>
                {% endfor %}
            </select>
        </div>
        <br>
        <button class="btn btn-outline-dark btn-lg" type="submit">Add Item</button>
    </form>
{% endblock %}

uj5u.com熱心網友回復:

因此,在我朋友的幫助下(向 Scraelos 大喊大叫!:),我們能夠使用 Flask 和 Jquery 的 Jsonify 功能解決這個問題。這與我最初想要實作的方法略有不同,但它更適合我的網路應用程式的通用目的。

(通過這樣做,我能夠消除通過“/add”路由的 GET 方法填充選擇選項的需要)

蟒蛇代碼:

@app.route("/options")
@login_required
def options():
    
    wtype = request.args.get('wtype')
    
    weapons = db.execute("SELECT id, name FROM weapons WHERE type = ?", wtype)
    mains = db.execute("SELECT id, name FROM mainp WHERE type = ? OR type = 0", wtype)
    majors = db.execute("SELECT id, description FROM majorp WHERE type = ? OR type = 0", wtype)
    minors = db.execute("SELECT id, description FROM minorp WHERE type = ? OR type = 0", wtype)
    
    return jsonify(weapons=weapons, mains=mains, majors=majors, minors=minors)

javascript代碼:

$(document).ready(function() {

      // first we hide opions 2-5 and button
      $('#wname').hide();
      $('#main_p').hide();
      $('#major_p').hide();
      $('#minor_p').hide();
      $('#submitbtn').hide();

      // when 1st available option is changed, we get JSON from "/options"
      $('#wtype').change(function(){

        $.getJSON('/options', {
          wtype: $('#wtype').val()
        
        // if request successful process data
        }).done(function(data) {
              
              // remeber selected options for later use
              mainp=$('#main_p').val();
              majorp=$('#major_p').val();
              minorp=$('#minor_p').val();
              
              // empty options for now...
              $('#wname').empty();
              $('#main_p').empty();
              $('#major_p').empty();
              $('#minor_p').empty();
              
              // appending placeholder options
              $('#wname').append($('<option disabled selected>Weapon Name</option>'));
              $('#main_p').append($('<option disabled selected>Main Prefix &#9734</option>'));
              $('#major_p').append($('<option disabled selected>Major Prefix &#9734&#9734</option>'));
              $('#minor_p').append($('<option disabled selected>Minor Prefix &#9734&#9734&#9734</option>'));              
              
              // appending real options available for chosen type trough itteration
              $.each(data.weapons, function(key, val) {
                $('#wname').append($('<option>').text(val.name).attr('value', val.id));
              });
              $.each(data.mains, function(key, val) {
                $('#main_p').append($('<option>').text(val.name).attr('value', val.id));
              });
              $.each(data.majors, function(key, val) {
                $('#major_p').append($('<option>').text(val.description).attr('value', val.id));
              });
              $.each(data.minors, function(key, val) {
                $('#minor_p').append($('<option>').text(val.description).attr('value', val.id));
              });
              
              // after all new options were added to selection, this "if" condition checks if previously saved option is in new options list
              if ($("#main_p option[value=" mainp "]").length > 0){
                // if true, select this option
                $('#main_p').val(mainp).change();
              }
              
              if ($("#major_p option[value=" majorp "]").length > 0){
                $('#major_p').val(majorp).change();
              }
              
              if ($("#minor_p option[value=" minorp "]").length > 0){
                $('#minor_p').val(minorp).change();
              }
              
              // make select options and button fadeIn from "hide"
              $('#wname').fadeIn();
              $('#main_p').fadeIn();
              $('#major_p').fadeIn();
              $('#minor_p').fadeIn();
              $('#submitbtn').fadeIn();
         })
      });
    });

畢竟 HTML 是這樣的:

{% extends "layout.html" %}

{% block title %}
    Add
{% endblock %}

{% block main %}
    <form action="/add" method="post">
        <div class="form-group">
            <select class="form-control col-md-4 bg-dark text-success" name="wtype" id="wtype">
                <option disabled selected>Weapon Type</option>
                <option value="-1">Melee</option>
                <option value="1">Ranged</option>
            </select>
            <br>
            <br>
            <select class="form-control col-md-4 bg-dark text-success" name="wname" id="wname">
                
        <!--    I was able to remove below syntax, by performing table select population through Jquery code in fetch.js
                
                <option disabled selected>Weapon Name</option>
                {% for weapon in weapons %}
                    <option value="{{ weapon["id"] }}"> {{ weapon["name"] }} </option>
                {% endfor %}
                
        -->
            </select>
            <br>
            <br>
            <select class="form-control col-md-4 bg-dark text-success" name="main_p" id="main_p"></select>
            <br>
            <br>
            <select class="form-control col-md-4 bg-dark text-success" name="major_p" id="major_p"></select>
            <br>
            <br>
            <select class="form-control col-md-4 bg-dark text-success" name="minor_p" id="minor_p"></select>
        </div>
        <br>
        <button class="btn btn-outline-dark btn-lg" type="submit" id="submitbtn">Add Item</button>
    </form>
    <script src="/static/fetch.js"></script>
{% endblock %}

也許有人會發現這個解決方案很有用。和平!:)

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/394257.html

標籤:javascript Python sqlite 烧瓶

上一篇:RoomAndroid忽略Dao類中的@Query條件(奇怪)

下一篇:SQLite:如果在表中發現重復值,則回傳真

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more