这是我的模特:
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将指向该表。但在我看来,这只是愚蠢的。我确信在基于类的视图之间传递数据更为专业。
答案 0 :(得分:1)
为什么不使用相同的视图并简单地覆盖get_queryset方法?
编辑:因为我看到你有一个单独的SearchView,这样你只需将表单的操作从空更改为{% url "name.of.your.resultsview" %}
并覆盖SearchView的get_queryset。