【问题标题】:Pull a column from sqlite3 and use those data in django dropdown从 sqlite3 拉一列并在 django 下拉列表中使用这些数据
【发布时间】:2021-06-26 07:15:15
【问题描述】:

----models.py---- 本模型使用django的sqlite3默认数据库

from django.db import models
from django.contrib.auth.models import User
class item_master(models.Model):
    item_name=models.CharField(max_length=200,null=False)
    item_price=models.IntegerField(max_length=5,null=False)

----views.py---- 这是这个django应用程序中的许多页面......“abc.html”是需要下拉列表的页面,“showitems”是相关功能。

from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404, redirect
from django.template import loader
from django.http import HttpResponse
from django import template
from app.models import item_master
from django import forms
from django_select2.forms import ModelSelect2Widget
from django.views import generic
import sqlite3

@login_required(login_url="/login/")
def index(request):

    context = {}
    context['segment'] = 'index'

    html_template = loader.get_template( 'index.html' )
    return HttpResponse(html_template.render(context, request))

@login_required(login_url="/login/")
def pages(request):
    context = {}

    try:

        load_template      = request.path.split('/')[-1]
        print(load_template)
        context['segment'] = load_template
        html_template = loader.get_template( load_template )
        if (load_template == "test.html"):
            items(request)
            return HttpResponse(html_template.render(context, request))
        elif (load_template == "abc.html"):
            showitems(request)
            return HttpResponse(html_template.render(context, request))
        else:
            return HttpResponse(html_template.render(context, request))

    except template.TemplateDoesNotExist:

        html_template = loader.get_template( 'page-404.html' )
        return HttpResponse(html_template.render(context, request))

    except:

        html_template = loader.get_template( 'page-500.html' )
        return HttpResponse(html_template.render(context, request))

def showitems(request):
    if request.method == "GET":
        showdrop = item_master.objects.all()
        return render(request,'abc.html',{"showdrop":showdrop})

----abc.html---- 前端的 HTML 代码

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/js/standalone/selectize.min.js" integrity="sha256-+C0A5Ilqmu4QcSPxrlGpaZxJ04VjsRjKu+G82kl5UJk=" crossorigin="anonymous"></script>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.6/css/selectize.bootstrap3.min.css" integrity="sha256-ze/OEYGcFbPRmvCnrSeKbRTtjG4vGLHXgOqsyLFTRjg=" crossorigin="anonymous" />


<select  id="selectitem" class="form-control" >
<option selected disabled="True">--- select --- </option>
  {% for result in showdrop %}
  <option value="{{result.id}}">{{result.item_name}}</option>
  {% endfor %}
</select>

[下拉列表未列出任何项目][1] [1]:https://i.stack.imgur.com/W8l0G.png

【问题讨论】:

    标签: javascript python html django drop-down-menu


    【解决方案1】:

    在您的abc.html 中似乎是正确的。您的 showitems 函数也根据您那里的信息正确传递了所有这些信息。

    也许这就是你使用 showitems 函数的方式...你在哪里调用它

    elif (load_template == "abc.html"):
        showitems(request)
        return HttpResponse(html_template.render(context, request))
    

    在使用showitems 函数在abc.html 页面上呈现信息后,它会返回并运行return HttpResponse(html_template.render(context, request)) 这一行,这很可能会覆盖showitems 函数在abc.html 页面。

    我了解您想要验证页面,以便显示错误页面,例如 page-404.html 和 page-500.html。我对您的建议是让您的 showitems 函数返回 item_master 的对象列表,而不是尝试将任何信息从那里呈现给 abc.html。

    例如:

    在您的 pages 函数中...

    elif (load_template == "abc.html"):
        context['showdrop'] = showitems(request) # Having the showdrop returned here to pass within this context.
        return HttpResponse(html_template.render(context, request))
    

    在你的 showitems 函数中...

    def showitems(request):
        if request.method == "GET":
            showdrop = item_master.objects.all()
            return showdrop 
    

    如果您没有在您的urls.py 中将showitems 声明为独立视图,这应该没问题。

    或者...

    你可以评论return HttpResponse(html_template.render(context, request))

    elif (load_template == "abc.html"):
        showitems(request)
        # return HttpResponse(html_template.render(context, request))
    

    并让您的 showitems 函数通过从那里渲染细节来完成工作......

    def showitems(request):
        if request.method == "GET":
            showdrop = item_master.objects.all()
            return render(request,'abc.html',{"showdrop":showdrop})
    

    【讨论】:

    • @Mio Myazz 如何获取此下拉列表的搜索框。在所有内容中,建议使用 django-select2。有没有其他方法可以完成?
    • @harishkrishna 我不熟悉django-select2 包。我刚刚阅读了一些内容,看来您需要对代码进行一些额外的编辑才能完成这项工作。也许jQuery 也可以用来完成这项工作,但我相信您可以编写一个视图来处理搜索框表单,该表单将验证搜索框中输入的值是否存在项目。
    • @Mio Myazz 我尝试添加 select2,终于成功了!
    • 恭喜我的兄弟!我很快就会试试那个包。
    猜你喜欢
    • 2018-02-03
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2014-08-26
    • 2020-06-23
    相关资源
    最近更新 更多