我想从下拉列表中选择选项,然后根据所选元素转到我的数据库文件CSV,显示与该所选元素相关的结果。
my HTML code:
{% extends "base.html"%}
{%block body%}
{% load static %}
<section>
<h2 align ="center" margin = 10px> Selecting parameters </h2>
<div>
<form align = 'center' method ="post" action=" help to describe this action url where to direct ?" >
{%csrf_token%}
<label class="label">Generators</label>
<select id = "myList" onchange="this.form.submit()">
{% for name in generator %}
<option> {{name}}</option>
{%empty%}
<option> no list found </option>
{%endfor%}
</select>
</div>
<div>
<button type="submit" class="myButton"> submit </button>
</div>
</form>
<textarea>{{selected_generator}}</textarea>
</section>
<footer id="main-footer"> <p> Copyright &2019; polito interdispilinary group 2019</p>
</footer>
{%endblock%}
</body>
</html>
Views.py
def generator(request):
file = pd.read_csv("G:/interdispilinary project/Website/resources/generator/up_op_zone.csv")
df = pd.DataFrame(file)
generator= df['generator']
operator = df['operator']
zone = df['zone']
return render(request, 'generator.html',{'generator':generator})
def gen_results(request):
if request.method =='POST':
user_submit = gen_form(request.POST)
print(request.POST)
if user_submit.is_valid():
print(user_submit)
selected_generator = user_submit.cleaned_data['generator']
request.session['selected_generator'] = selected_generator
df = pd.read_csv("G:/interdispilinary project/Website/resources/generator/up_op_zone.csv",names=["generator","operator","zone"])
df1 = df[df["generator"]==selected_generator][["operator","zone"]]
return render(request, 'generator.html',{'selected_generator':selected_generator})
url.py
urlpatterns = [
url(r'^$', views.homepage, name='homepage'),
url(r'^generator', views.get, name='generator_url'),
url(r'^gen_results', views.gen_results, name='gen_results_url'),
url(r'^market', views.market, name='market_url'),
url(r'^operator', views.operator, name='operator_url'),
当我单击提交按钮时,必须将结果保存到会话中,然后根据gen_result函数,它应该再次呈现页面
答案 0 :(得分:0)
action=" help to describe this action url where to direct ?"
我认为这应该是(并且尝试此操作时您可能仍会收到错误):
action="{% url 'gen_results' %}"
在您的urls.py中:
url(r'^generator', views.get, name='generator_url'),
也许应该指向views.generator?
但是这些可能不是您gen_results视图返回“ None”的原因。我将开始调试'gen_results'是否返回任何东西。如果render()失败,或者URL映射到一个无效的视图,您将收到另一个错误-该错误是views.gen_results永远不会到达其“ return”语句:
if request.method == 'POST':
# ... as you have it
else:
print('actual method=', request.method)
好运。
(很抱歉,如果您已经了解表格的全部信息)
大概在forms.py中,您有类似的东西:
class GenForm(forms.Form):
fields = forms.ChoiceField(choices=[(index,generator_name)])
'choices'参数需要一个2元组的列表;我认为您当前在模板中仅包含名称。我不确定,但我认为第一个字段旨在表示主键或代码,而第二个字段更多是“ display_name”。对您来说,这样做可能更容易(generator_name,generator_name)
要将表单用于GET和POST,您的视图(生成器)应创建gen_form并设置其选择的值:
generator_list=[(generator,generator) for generator in generators]
gen_form = GenForm(choices=generator_list)
然后将其传递给模板:
return render(request, 'template', {'gen_form':gen_form})
然后将其渲染为“简化的”,例如(尚未检查此html,因此提交按钮可能不太正确,抱歉):
<form method="post" action="{% url gen_results %}">
{{ csrf_token }}
<p>Please select which generator you're interested in:</p>
{{ gen_form }}
<input type="submit">Submit</input>
</form>
或者,您不能在任何地方使用Django表单API,而只能从request.POST获取提交的生成器名称(一旦确定了它的名称)(在print(request.POST)中戳一下)。如果表单或字段的ID为'generator_name',则request.POST ['generator_name']应返回选择的字符串。