Skip to main content
 首页 » 编程设计

python之单击页面按钮后如何防止 Django 表单被重置

2025年05月04日38bonelee

我有一个从用户那里获取输入值的 Django 表单。然后使用这些值对表 ResourceBase 进行查询,最终返回过滤结果列表。

由于结果可能很长,我添加了带有“上一页”和“下一页”按钮的分页功能。我的问题是,当我单击“Prev”或“Next”按钮时,表单恢复为默认值。并且所有返回的结果都没有了。我如何防止这种情况发生?

我认为当请求不是“POST”时,表单会因为“form1 = QueryForm()”而被重置。但是,由于我是 Django 和 Web 开发人员的新手,所以我很难想出一个简洁的解决方案。

在 views.py 中:

 
def search(request): 
 
    if request.method == "POST": 
 
        form1 = QueryForm(data=request.POST) 
 
        layer_dict = [] 
 
        if form1.is_valid(): 
 
            inp_ct = form1.cleaned_data['country'] 
 
            q1 = ResourceBase.objects.filter(country_name__iexact=inp_ct) 
 
            for layer in q1: 
 
                down_url = 'xxxxxxx'.format(layer.title) 
                view_url = 'xxxxxxx'.format(layer.title) 
                layer_dict.append((layer.title, down_url, view_url)) 
 
            layer_dict = sorted(layer_dict, key = lambda x:x[0]) 
 
            paginator = Paginator(layer_dict, 10) 
 
            page = request.GET.get('page', 1) 
 
            try: 
                layers = paginator.page(page) 
            except PageNotAnInteger: 
                # If page is not an integer, deliver first page. 
                layers = paginator.page(1) 
            except EmptyPage: 
                # If page is out of range (e.g. 9999), deliver last page of results. 
                layers = paginator.page(paginator.num_pages) 
 
            context = {'form1': form1, 'layers': layers} 
 
    else: 
 
        form1 = QueryForm() 
 
        context = {'form1': form1} 
 
 
    return render(request, 'my_app/search.html', context) 
 
 

在 search.html 中:

<br /> 
<h3>Pagination Test</h3> 
<br /><br/> 
 
 
<div class="row"> 
    <div class="col-md-4"> 
        <form method="POST"> 
            {% csrf_token %} 
 
              <div class="form-controls"> 
                {{ form1|as_bootstrap }} 
              </div> 
            <button class="btn btn-primary" type="submit" style="float: right;" title = "Click to search" ><i class="fa fa-search"></i></button> 
        </form> 
 
        <form method="GET"> 
            <button class="btn btn-primary" type="submit" value="Reset" name="Reset" title="Reset all choices">Reset</button> 
        </form> 
    </div> 
</div> 
 
 
{% if layers %} 
 
<div class="row"> 
 
    <div class="col-md-8"> 
 
        <div id = "search_results" > 
 
            <table class="table table-hover"> 
              <thead> 
                <tr> 
                  <th scope="col">Select</th> 
                  <th scope="col">Layer Name</th> 
                  <th scope="col">Download</th> 
                  <th scope="col">View Layer</th> 
                </tr> 
              </thead> 
 
              <tbody> 
                {% for layer in layers %} 
                <tr> 
                  <td><input class= messageCheckbox type="checkbox" name="checks" value="{{layer.1}}"/></td> 
                  <td>{{layer.0}}</td> 
                  <td><a href="{{layer.1}}" target="_blank"> Download Layer </a></td> 
                  <td><input class="btn btn-primary" onclick="window.open('{{layer.2}}')" id="view" type="button" name="view" value="View"></td> 
                </tr> 
                {% endfor %} 
 
                <tr> 
                    <td><input type="checkbox" onClick="toggle(this, 'checks')"/> Select All</td> 
                    <td></td> 
                    <td></td> 
                    <td></td> 
                </tr> 
 
              </tbody> 
            </table> 
 
            <button class="btn btn-primary" type="button" name="download" style="float: left;" onClick= "open_all_links();">Download Selected</button> 
 
        </div> 
 
 
     <div class="a_pagination" align="right"> 
            <span class="step-links"> 
 
                {% if layers.has_previous %} 
 
                    <a class="btn btn-primary btn-sm" name="prev_page" href="?page={{ layers.previous_page_number }}" role="button">Prev.</a> 
                {% endif %} 
 
                <span class="current" style ="color:#2C689C;font-size:16px;padding:8px;"> 
                    page {{ layers.number }} of {{ layers.paginator.num_pages }} 
                </span> 
 
                {% if layers.has_next %} 
                    <a class= "btn btn-primary btn-sm"  href="?page={{ layers.next_page_number }}" role="button">Next</a> 
 
                {% endif %} 
 
            </span> 
        </div> 
    </div> 
</div> 
 
{% endif %} 
 
<script type="text/javascript" > 
....... 
</script> 

请您参考如下方法:

您不需要使用POST 方法 将您的参数传递给您的views.py。 按照下面的示例重写您的 view 和 html form。 这里有一个简单的表格供用户输入搜索词:

<form method="get" action=""> 
    <input type="text" name="search4" class="search_input" placeholder="Search" required="required">                                        
    <input type="submit" value="Search"> 
</form> 

下一步是检查 views.py 中的输入,我们将输入标记命名为 name="search4" 所以我们检查是否有在我们的 views.py 中使用此代码在我们的表单中输入:

from django.db.models import Q 
from django.core.paginator import Paginator 
 
def search(request): 
    query = request.GET.get("search4") 
    if query: 
        queryset = ResourceBase.objects.objects.all() # this will get all of your object of your model 
        results = queryset.filter(Q(country_name__iexact=query)).all()  
        number_of_objects = results.count() # get the exact number of object to show in your html file 
        paginator = Paginator(results, 12)  # Show 12 contacts per page 
        page_var = 'page' # this will use for pagination in your html file 
        page = request.GET.get(page_var) # this will use for pagination in your html file 
        contacts = paginator.get_page(page)  # send only 12 object to your html file to show to user 
         context = { 
            "items": contacts, 
            "key": str(query), 
            'page': page_var,  
            "number_of_objects": number_of_objects, 
        } 
        return render(request=request, template_name='search.html', context=context, content_type=None, status=None, 
                  using=None) 
    else: 
        ... # if user didn't enter anything to search 

在您的数据库中获取并搜索用户输入后,您应该在您的 search.html 文件中将其显示给用户,如下所示:

{% for item  in items %} 
<div> 
    <div> 
            <div class="product_title">{{ item.title }}</div> # show the part that you want the users to see 
            ...                                               # rest of your item parts to show 
    </div> 
</div> 
{% endfor %} 
 
<div class="pagination"> 
                    <span class="step-links"> 
                        {% if items.has_previous %} # check the pagination that if there is perivious pages  
                            <a href="?{{ page }}=1">&laquo; first</a> 
 
                            <a href="?{{ page }}={{ items.previous_page_number }}">previous</a> 
                        {% endif %} 
 
                        <span class="current"> 
                            Page {{ items.number }} of {{ items.paginator.num_pages }} # example of result : Page 1 of 13 
                        </span> 
 
                        {% if items.has_next %} 
                            <a href="?{{ page }}={{ items.next_page_number }}"</a> # check the pagination that if there is any next or perivious pages  
 
                            <a href="?{{ page }}={{ items.paginator.num_pages }}">last &raquo;</a> # a link to last page 
                        {% endif %} 
                    </span> 
                    {{ pagination }} 

这是一个带有 Paginator 的基本搜索页面,如果您需要任何进一步的帮助或问题,我很乐意提供帮助。