【问题标题】:Passing FormView data from CBV to another CBV将 FormView 数据从 CBV 传递到另一个 CBV
【发布时间】:2015-01-16 13:21:15
【问题描述】:

这是我的模型:

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 来解决这个问题,但它不起作用.现在发生的事情是提交后,成功的url被调用,results.html加载了数据库中的全部内容。

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我必须更改表单才能获得完成此任务的请求,但它可以工作,谢谢!
    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 2023-03-21
    • 2013-12-05
    • 2019-12-22
    • 2020-05-22
    • 2017-07-06
    • 2019-12-31
    • 1970-01-01
    相关资源
    最近更新 更多