Как создать выпадающую форму 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 за помощь в решении этой проблемы.