#python #django #forms #search #get
#python #django #формы #Поиск #получить
Вопрос:
Он отображает форму сверху, и когда вы отправляете ее, она покажет только некоторые Offer
экземпляры, которые соответствуют фильтрам. Это работает нормально, но каждый раз, когда я отправляю его, форма возвращается к исходному значению. Как я могу это остановить? Моя форма использует GET
и представление основано на классе. Кроме того, __init__
в форме, похоже, не работает.
views.py
class Search(ListView, FormMixin):
model = Offer
template_name = 'search.html'
paginate_by = 20
form_class = SearchForm
def get_queryset(self):
self.form = SearchForm(self.request.GET)
if self.form.is_valid():
data = self.form.cleaned_data
qs = Offer.objects.all()
if data['book'] != '0':
qs = qs.filter(book_id=data['book'])
qs = qs.filter(worn_degree__in=data['min_worn_degree'])
qs = qs.filter(note_degree__in=data['min_note_degree'])
return qs
else:
return Offer.objects.all()
search.html
{% extends 'base_generic.html' %}
{% block content %}
<form method="get">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<br>
<input type="submit" value="검색">
</form>
{% if object_list %}
{% for object in object_list %}
<p>{{ object.book.title }}</p>
<p>{{ object.seller }}</p>
{% endfor %}
{% else %}
<p>There are no offers.</vp>
{% endif %}
{% endblock %}
forms.py
class SearchForm(forms.Form):
def __init__(self, *args, **kwargs):
super(SearchForm, self).__init__(*args, **kwargs)
self.book = '0'
self.min_worn_degree = 'abc'
self.min_note_degree = 'abc'
BOOK_CHOICE = tuple([('0', '모두')] [(book.id, book.title) for book in Book.objects.all()])
book = forms.ChoiceField(label='책', choices=BOOK_CHOICE)
MIN_QUALITY = (
('a', '상 이상'),
('ab', '중 이상'),
('abc', '하 이상'),
)
min_worn_degree = forms.ChoiceField(label='낡은 정도', choices=MIN_QUALITY)
min_note_degree = forms.ChoiceField(label='필기 정도', choices=MIN_QUALITY)
Ответ №1:
добавьте этот код в Search
класс:
def get_context_data(self, *, object_list=None, **kwargs):
form = SearchForm(self.request.GET)
context = super(Search, self).get_context_data(**kwargs)
context['form'] = form
return context