从 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.html
和 page-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})
----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.html
和 page-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})