добавление выпадающего списка для django

#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