【问题标题】:Django views.py : unable to use vriable outside functionDjango views.py:无法在函数外使用变量
【发布时间】:2021-03-24 12:21:26
【问题描述】:

我希望在填写 django 表单时打开一个新页面 - 通过按回车键/单击“搜索”输入并使用表单中输入的数据在该页面中显示结果。

forms.py:

class SearchBar(forms.Form):
    Search = forms.CharField(label='', max_length=100, widget=forms.TextInput)

带有表单的 HTML 页面如下所示:

index.html

<form class="" action="result" method="post">
          
          {% csrf_token %}
          {{ form1.as_table }}

          <input class="Search" type="submit" name="" value="Search">

</form>

我想提交这个表单打开一个新页面:result.html

我已将“结果”的 url 设置为上述 HTML 页面:

urls.py

urlpatterns=[
    path('result', views.result, name='result'),
]

我已经提取了form1.cleaned_data['Search']在from中输入的数据。

form_input=form1.cleaned_data['Search']

但是,一旦打开结果页面,就显示数据(form_input)没有定义。 显示以下错误:

name 'form_input' is not defined

我无法在 views.py 文件的任何其他函数中使用此数据 (form_input)。

views.py

def index(request):
    form1 = forms.SearchBar()
    if request.method == "POST":
        form1 = forms.SearchBar(request.POST)
        if form1.is_valid():
            global form_input
            form_input= (form1.cleaned_data['Search'])

def result(request):
    print(form_input)

我不明白为什么会这样。我什至将变量form_input 声明为global 变量。

【问题讨论】:

    标签: python html django django-views django-forms


    【解决方案1】:

    你必须这样做:

    views.py

    from . forms import SearchBar
    
    def search_view(request):
        if request.method == "POST":
            form = SearchBar(request.POST)
            if form.is_valid():
                form_input = form.cleaned_data['Search']
                search_result = # your search query using the form_input variable
                return render(request, "result.html", {"search_result ": search_result })
    

    如果我理解正确,您希望在 base.html (所有其他模板继承的基本模板)中有您的搜索栏,那么您在模板中的搜索栏将写如下内容这个:

    <form action={% url 'search_view' %} method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Search</button>
    </form>
    

    result.html 看起来像这样:

    {% for item in search_result %}
        {{ i.name }}
    {% endfor %}
    

    更新

    好吧,显然搜索栏的目的是过滤和显示给定模型的对象,例如,如果您有一个 User 模型:

    class User(models.Model):
        name = models.CharField(max_length=50)
        is_active = models.BooleanField(default=True)
    

    并希望根据您的 user.name 过滤对象,那么代码行将如下所示:

    search_results = User.objects.filter(name__contains=form_input)
    

    例如,如果您有 3 个用户,其名称为 Tom JablinskiTommy JoeJack White(例如)并搜索对于 Tom,您将获得一个包含 2 个用户对象的查询集:Tom JablinskiTommy Joe,它们将显示在 result.htmltemaplte。

    【讨论】:

    • “search_result = #your search query using the form_input variable”是什么意思?是的,情况就是这样..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2016-03-12
    相关资源
    最近更新 更多