将FormView数据从CBV传递到另一个CBV

时间:2014-11-19 05:44:43

标签: python django django-forms django-views django-class-based-views

这是我的模特:

class DataEm(models.Model):
    title = models.CharField(max_length=255, blank=True)

这是我的基本搜索表单:

from django import forms


class SearchForm(forms.Form):
    App_title = forms.CharField(max_length=256)

这就是我在这个领域的views.py的样子:

class ResultsView(generic.ListView):
    model = DataEm
    template_name = 'explorer/results.html'
    context_object_name = 'apps'


class SearchView(generic.FormView):
    template_name = 'explorer/search.html'
    form_class = sf.SearchForm
    success_url = '/explorer/results/'


def get_data(form):
    name = form.cleaned_data['App_title']
    apps = DataEm.objects.filter(title__contains=name)
    return apps

这些是我的search.html和results.html模板(分别):

<form action="" method='post'>{% csrf_token %}
{{ form.as_p }}
<input type='submit' value='Search' />
</form>

<table>
    {% for app in apps %}
        <tr>
            <td>{{ app.title }}</td>
            <td>{{ app.price }}</td>
        </tr>
    {% endfor %}
</table>

当用户提交表单时,我想运行get_data()方法以根据他的关键字获取搜索结果,并将页面重定向到results.html页面,在那里显示搜索结果。

显然第一个表单和第二个表单之间没有任何连接,我一直试图通过从SearchView.form_valid()调用redirect()快捷方式或render_to_response来解决这个问题。但它不起作用。现在发生的事情是,在提交之后,调用success_url并将results.html加载到数据库中的所有内容。

唯一可行的解​​决方案是通过入侵form_valid()并调用get_data()并将结果写入数据库中的一个单独的表,ResultsView将指向该表。但在我看来,这只是愚蠢的。我确信在基于类的视图之间传递数据更为专业。

1 个答案:

答案 0 :(得分:1)

为什么不使用相同的视图并简单地覆盖get_queryset方法?

编辑:因为我看到你有一个单独的SearchView,这样你只需将表单的操作从空更改为{% url "name.of.your.resultsview" %}并覆盖SearchView的get_queryset。