从 sqlite3 中提取一列并在 django 下拉列表中使用这些数据

Pull a column from sqlite3 and use those data in django dropdown

----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

在您的 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.htmlpage-500.html 等错误页面。我对你的建议是让你的 showitems 函数到 return 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})