django - 如何在django分页中实现Post/Redirect/Get?

标签 django django-templates django-views

我有一个 View 可以过滤掉已发布搜索表单的结果:

def profile_advanced_search(request):
    args = {}
    if request.method == "POST":
        form = AdvancedSearchForm(request.POST)
        qs=[]
        if form.is_valid():
            cd = form.cleaned_data

            s_country=cd['country']
            s_province=cd['province']
            s_city = cd['city']

            if s_country: qs.append(Q(country__icontains = s_country))    
            if s_province: qs.append( Q(province__icontains=s_province))                
            if s_city: qs.append( Q(city__icontains=s_city))



            f = None
            for q in qs:
                if f is None: 
                    f=q 

                else: f &=q
            list = UserProfile.objects.filter(f).order_by('-created_at') 


    else:
        form = AdvancedSearchForm()
        list = UserProfile.objects.all().order_by('-created_at')

    paginator = Paginator(list,10)            
    page= request.GET.get('page')
    try:
        results = paginator.page(page)
    except PageNotAnInteger:
        results = paginator.page(1)  

    except EmptyPage:
            results = paginator.page(paginator.num_pages)        

    args.update(csrf(request))    
    args['form'] = form  
    args['results'] = results
    return render_to_response('userprofile/advanced_search.html', args,
                              context_instance=RequestContext(request))  

urls.py 部分是:

url(r'^search/$', 'userprofile.views.profile_advanced_search'),

模板是:

  <form action="/search/" method="post">{% csrf_token %}

              <ul class="list-unstyled">

                <li><h3>Country</h3></li>
                <li>{{form.country}}</li><br> 
                <h4>Province</h4>
                <li>{{form.province}}</li>
                  <h4>City</h4>
                <li>{{form.city}}</li>


              </ul>

    <input  type="submit" name="submit"  value="search" />

     </form>
         Search Results:
    {% for p in results %}

                <div">
                      <div>
                          <br>
                           <strong><a href="/profile/{{p.username}}" >{{p.username}}</a></strong>
                             {{p.country}} <br>
                             {{p.province}} <br>
                             {{p.city}} <br>

                         </div>
                      </div>
    {% endfor %}



    <div>
        <div class="pagination">
          {% if results.has_previous %}
              <a href="?page={{ results.previous_page_number }}"> << Prev </a>&nbsp;&nbsp
          {% endif %}

           {% if results.has_next %}
              <a href="?page={{ results.next_page_number }}"> Next >> </a>
          {% endif %}
        </div>
      </div>

    </div>

这些对于第一页效果很好,但要处理后面的页面,它是 suggested我需要实现 Post/Redirect/Get 。

但是,我很难制作这样的 View /模板/url 来处理 GET 页面,因为所有搜索参数都是任意的。所以我很欣赏完整的解决方案。

最佳答案

您需要 2 次观看吗?第一个用于表单搜索,第二个用于显示结果。您尚未在示例代码中以任何方式实现重定向!

网址

...
url(r'^search/$', 
    'userprofile.views.profile_advanced_search'),
url(r'^show/(?P<country>\w+)/(?P<province>\w+)/(?P<site>\w+)/(?P<page>\d+)',
    'userprofile.views.profile_advanced_show'),
...

个人资料高级搜索

def profile_advanced_search(request):
    args = {}
    if request.method == "POST":
        form = AdvancedSearchForm(request.POST)
        qs=[]
        if form.is_valid():
            cd = form.cleaned_data

            s_country=cd['country']
            s_province=cd['province']
            s_city = cd['city']

            return HttpResponseRedirect(
               reverse('userprofile.views.profile_advanced_show', 
                        args=(s_country, s_province, s_city, 0, )))

   return HttpResponseRedirect(
               reverse('userprofile.views.profile_advanced_show', 
                        args=('+', '+', '+', 0, )))

profile_advanced_show

def profile_advanced_show(request, s_country='', 
                          s_province='', s_city='', page=0):
    f = some filters with s_country, s_province and s_city
    list = UserProfile.objects.filter(f).order_by('-created_at') 

    paginator = Paginator(list,10)            
    try:
        results = paginator.page(page)
    except PageNotAnInteger:
        results = paginator.page(1)  

    except EmptyPage:
        results = paginator.page(paginator.num_pages)        

    args.update(csrf(request))    
    form = AdvancedSearchForm(initial={ 's_country': s_country, ... } )
    args['form'] = form  
    args['results'] = results
    return render_to_response('userprofile/advanced_search.html', args,
                              context_instance=RequestContext(request))        

注意:针对无效表单提交进行改进。请记住,您可以通过 GET 将参数作为键值而不是路由值发送到第二个 View 。

关于django - 如何在django分页中实现Post/Redirect/Get?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28776108/

相关文章:

django - 如何从 Django 模板中的页面迭代 cms 插件实例?

python - Django 模板不显示表数据

python - Django 中的替代管理员

django - 我应该使用 request.POST 或 form.cleaned_data 中的文本吗

python - 如何在开发人员之间管理 django 1.7 中的迁移?

Django表单PUT和DELETE http方法

python - Django 基于类的 View : How do I pass additional parameters to the as_view method?

django - 如何从Django_tables2行获取信息?

Oauth 登录后 django allauth 未创建用户帐户

javascript - 使用 Javascript/jQuery 动态显示/隐藏 div(复选框)