Как мне изменить шаблон, отображаемый после того, как пользователь нажимает кнопку?

#django #django-templates #django-views

#django #django-шаблоны #django-просмотры

Вопрос:

Я совсем новичок в Django, поэтому прошу прощения, если я делаю глупые ошибки.
Вот код, который у меня есть на данный момент:

Для views.py:

 def bylog(request):
    if request.POST.get('Filter'):
        return render(request, 'index.html', context)
    filtered_login = Invalid.objects.values_list('login').distinct()
    filtered = []
    for item in filtered_login:
        filtered.append(item[0])
    results = {'results': results, 'filtered': filtered}
    return render(request, 'bylog.html', context)
 

Вот фрагмент bylog.html:

 <select id>"dropdown">
{% for item in filtered %}
    <option value={{ item }}">{{ item }}</option>
{% endfor %}
</select>
<input type="submit" value="Filter" name="Filter" />
 

Моя главная цель — получить значение из выпадающего списка, и после того, как пользователь нажмет Filter кнопку, значение будет передано другому шаблону.
Это вообще возможно?

Спасибо за помощь.

Ответ №1:

Основное для вашей цели, я полагаю, это управление POST в django, что означает, что вы хотите отправить любые данные / переменные из шаблона в представление, а затем выполнить с ним любую операцию (отправить его в другой шаблон или сохранить …)

Основным для этого является (использование HTML-формы, а не формы Django):

 - Create a HTML form in the template 
- Add the selects/inputs with the data you want to manage and a button/input to make the post
- Manage the post in the view
 

ПРИМЕР

форма шаблона

 <form id="" method="post" action=".">
{% csrf_token %}
<select id="any_name" name="any_name">"dropdown">
{% for item in filtered %}
    <option value={{ item }}">{{ item }}</option>
{% endfor %}
</select>
<input type="submit" value="Filter" name="Filter" />

</form>
 

view.py

 def your_view(request):
    if request.method == 'POST':  # If anyone clicks filter, you receive POST method
        data = request.POST['any_name']
        # Do what you need here with the data
        # You can call another template and send this data
        # You can change any_name for the variable you want, changing the name and id in the select

#Your view code
 

Я рекомендую вам прочитать об Django forms этом, потому что, если вам нужна форма большего размера для управления данными модели с большим количеством полей, a Django Form сэкономит вам много времени

Работа с формами Django

Комментарии:

1. Вау, спасибо вам за подробный ответ. Я обязательно это проверю. В нем говорится, что мне нужен csrf_token, когда я пытаюсь сделать то, что я делал ранее, но я могу провести свое исследование по этому вопросу. Большое спасибо!

2. о, извините, я забыл добавить токен, добавить {% csrf_token %} внутри формы (я исправил код, проверьте сейчас)