微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在基于类的视图中使用先前的输入初始化django表单?

如何解决如何在基于类的视图中使用先前的输入初始化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)

解决方法

将此代码添加到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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。