Как мне инициализировать форму django с предыдущим вводом в представлении на основе класса?

#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