Как создать выпадающую форму Django с помощью forms.py без модели?

Мне нужно создать простой фильтр представления для веб-страницы Django. Поскольку он отбрасывается без необходимости хранения, мне не нужно использовать Model overhead.

Вот мой соответствующий код views.py:

@login_required()
def cards(request):
    # form = CountryForm()
    f_name = STAT_FILES / 'csv/segment_summary_quart.csv'
    # pathname = os.path.abspath(os.path.dirname(__file__))
    df = pd.read_csv(f_name, index_col=None)

    pl_name = STAT_FILES / 'pickles/lbounds'
    pu_name = STAT_FILES / 'pickles/ubounds'
    lbounds = pickle.load(open(pl_name, "rb"))
    ubounds = pickle.load(open(pu_name, "rb"))

    filter_name = []
    i = 0
    max_i = len(ubounds)
    while i < max_i:
        filter_name.append(f'Personal best trophy range: {str(int(lbounds[i])).rjust(4," ")}-{str(int(ubounds[i])).rjust(4," ")}')
        i += 1

    sort_name = []
    sort_name.append("Alphabetic Order")
    sort_name.append("Most Popular")
    sort_name.append("Least Popular")
    sort_name.append("Highest Win Rate")
    sort_name.append("Lowest Win Rate")

    form = cardStatsForm(filter_name, sort_name)

Учитывая, что значения могут меняться динамически, я пытаюсь создать объект cardStatsForm(), изначально не зная значений, которые будут иметь место при публикации страницы конечному пользователю. Следующий код находится в файле forms.py:

from django import forms


class cardStatsForm(forms.Form):
    def __init__(self, filter_opts, sortOrder, *args, **kwargs):
        super(cardStatsForm, self).__init__(*args, **kwargs)
        self.fields['filts'].choices = filter_opts
        self.fields['sorts'].choices = sortOrder

    filts = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=(), required=True)
    sorts = forms.Select(choices=())

К сожалению, мне еще не приходилось беспокоиться о html стороне, так как я продолжаю получать следующую ошибку относительно класса моей формы:

KeyError at /clashstats/cards/
'sorts'
Request Method: GET
Request URL:    http://127.0.0.1:8000/clashstats/cards/
Django Version: 4.0
Exception Type: KeyError
Exception Value:    
'sorts'
Exception Location: /Users/cooneycw/PycharmProjects/The6ix/clashstats/forms.py, line 8, in __init__
Python Executable:  /Users/cooneycw/miniforge3/envs/The6ix/bin/python

Я больше знаком с фреймворком flask и вижу, что Django в большей степени полагается на объекты, с которыми я знаком меньше. Что я делаю неправильно?

Решение, рекомендованное AMG выше, позволило мне преодолеть эту ошибку. Следующая ошибка была связана с ожиданием кортежей для списков выбора. Следующий код, модифицированный для отправки кортежей для элементов списка, теперь завершается успешно:

forms.py

from django import forms


class cardStatsForm(forms.Form):
    def __init__(self, filterList, sortList, *args, **kwargs):
        super(cardStatsForm, self).__init__(*args, **kwargs)
        self.filts = []
        self.sorts = []
        self.fields['filts'].choices = filterList
        self.fields['sorts'].choices = sortList

    filts = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=(), required=True)
    sorts = forms.ChoiceField(choices=())

views.py

@login_required()
def cards(request):
    # form = CountryForm()
    f_name = STAT_FILES / 'csv/segment_summary_quart.csv'
    # pathname = os.path.abspath(os.path.dirname(__file__))
    df = pd.read_csv(f_name, index_col=None)

    pl_name = STAT_FILES / 'pickles/lbounds'
    pu_name = STAT_FILES / 'pickles/ubounds'
    lbounds = pickle.load(open(pl_name, "rb"))
    ubounds = pickle.load(open(pu_name, "rb"))

    filter_name = []
    i = 0
    max_i = len(ubounds)
    while i < max_i:
        filter_name.append(f'Personal best trophy range: {str(int(lbounds[i])).rjust(4," ")}-{str(int(ubounds[i])).rjust(4," ")}')
        i += 1
    filter_id = range(len(filter_name))
    filter_list = list(zip(filter_id, filter_name))

    sort_name = []
    sort_name.append("Alphabetic Order")
    sort_name.append("Most Popular")
    sort_name.append("Least Popular")
    sort_name.append("Highest Win Rate")
    sort_name.append("Lowest Win Rate")

    sort_id = range(len(sort_name))
    sort_list = list(zip(sort_id, sort_name))

    form = cardStatsForm(filter_list, sort_list)

Моя благодарность https://stackoverflow.com/users/4872140/amg за помощь в решении этой проблемы.

Вернуться на верх