#python #django
#python #django
Вопрос:
Я сейчас изучаю Django и пытаюсь добавить выпадающий список на веб-сайт. На веб-сайте прямо сейчас будет показан список игр. Выпадающий список имеет разные платформы, и я хочу, чтобы список игр изменился после того, как пользователь выберет одну платформу. Что мне делать?
В form.py
:
class platformSelectForm(forms.Form):
platformsList = (
('all', 'Please Select'),
('NS', 'Nintendo Switch'),
('PS4', 'PlayStation4'),
('PS5', 'PlayStation5'),
('XBO', 'Xbox One'),
('XS', 'Xbox Series S/X'),
);
platforms_Select = forms.ChoiceField(widget = forms.Select, choices = platformsList, required = False);
В view.py
:
class showGameLists(TemplateView):
template_name = "showList/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs);
platformSelect = platformSelectForm(self.request.POST or None);
context['platformSelect'] = platformSelect;
games = getGames(nowDay.year, nowDay.month, platforms);
context['games'] = games;
context['year'] = nowDay.year;
context['month'] = calendar.month_name[nowDay.month];
context['prevMonth'] = prevMonth(nowDay);
context['nextMonth'] = nextMonth(nowDay);
return context
В urls.py:
from django.urls import path;
from .views import showGameLists;
urlpatterns = [
path('', showGameLists.as_view(), name='home')
]
В home.html:
<form method = 'POST' action = '/'>
{% csrf_token %}
{{ platformSelect.as_p }}
<input type='submit' value='Submit' />
</form>
{% for game in games %}
<div>
<span><h2>{{game.0}}</h2>
<p>Release Date: {{ game.1 }}, Metacritic: {{ game.3 }}</p>
<p>Platform: {% for platform in game.2 %}{{ platform }}/{% endfor %}</p>
{% if game.4 %}
<img src={{game.4}} width="367" height="204">
{% endif %}
</div>
{% endfor %}
прямо сейчас я могу показать список и кнопку отправки.
Но я пробую много способов получить значение из выпадающего списка, но это также неправильно для меня:
[17/Jan/2021 11:15:29] "POST / HTTP/1.1" 405 0
Method Not Allowed (POST): /
Method Not Allowed: /
Ответ №1:
Вы получаете Method Not Allowed (POST)
сообщение об ошибке, потому что вы используете a TemplateView
для отправки POST
запроса, вместо этого вы должны использовать FormView
так:
class showGameLists(FormView):
template_name = "showList/home.html"
form_class = platformSelectForm # pass your form class here
def form_valid():
form.save() # process form submit
return redirect('view_to_redirect_to')
Комментарии:
1. Да, я знаю, но если я перейду на FormView, как насчет других?
2. А как насчет других, что? Можете ли вы объяснить? Это должно сработать, нет причин использовать
TemplateView
, если вы не хотите отображать только некоторые необработанныеhtml
данные. Кроме того, вы можете наследовать от несколькихCBV
s.3. Я имею в виду список, который я показываю на веб-странице (def get_context_data(self, ** kwargs): part), что я должен изменить в этой части, чтобы она отображалась нормально?
4. вы
get_context_data
также можете использоватьFormView
in