我希望在填写django表格时打开一个新页面-点击enter/点击"搜索"输入,并使用表格中输入的数据在该页面中显示结果。
表单.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']
在中输入的数据。
form_input=form1.cleaned_data['Search']
但是,一旦打开结果页面,就会显示数据(form_input(未定义。显示以下错误:
name 'form_input' is not defined
我无法在views.py
文件的任何其他函数中使用此数据(form_input(。
视图.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
变量。
您必须执行以下操作:
视图.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 Jablinski、Tommy Joe和Jack White的用户(例如(,并搜索Tom,则会得到一个包含2个用户对象的查询集:汤姆Jablinski,Tommy Joe,它们将显示在result.html
temaplate中。