Django: после выбора элемента из выпадающего списка, как выполнить действие - PullRequest
0 голосов
/ 20 мая 2019

Я хочу выбрать опцию из выпадающего списка и в соответствии с выбранным элементом перейдите к файлу моей базы данных, который 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 должен снова отобразить страницу

1 Ответ

0 голосов
/ 21 мая 2019

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' хотел получить список из двух кортежей; Я думаю, что в настоящее время у вас просто есть имена в вашем шаблоне. Я не уверен, но я думаю, что первое поле предназначено для представления первичного ключа или кода, а второе - больше «display_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>

В качестве альтернативы, вы не можете использовать API форм Django в любом месте и просто получить имя отправленного генератора из request.POST, как только вы определитесь, как он вызывается (напечатайте (request.POST)). request.POST ['generator_name'] должен возвращать выбранную строку, если форма или поле имели id = 'generator_name'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...