2016-07-12 12 views
0

GET URLからパラメータを削除する必要がありました。私はそれを行うには「正しい」方法を見つけることができませんでしたので、私はこのように私自身のフィルタを書いた:GETパラメータを正しく削除する方法

@register.filter(name='url_without_parameter') 
def url_without_parameter(arg1, arg2): 
    """ 
    Removes an argument from the get URL. 
    Use: 
     {{ request|url_without_parameter:'page' }} 

    Args: 
     arg1: request 
     arg2: parameter to remove 
    """ 
    if arg1.GET.getlist(arg2): 
     # get all parameters : 
     full_url = urlparse.urlparse(arg1.get_full_path()) 
     parameters = {} 
     # reconstruct query 
     for key, value in urlparse.parse_qsl(full_url.query): 
      if parameters.get(key, None) is None: 
       parameters[key] = value 
     # remove parameters 
     if parameters.get(arg2) is not None: 
      del parameters[arg2] 
     arg1.META['QUERY_STRING'] = u'&'.join([ 
      u'{}={}'.format(key, value) 
      for key, value in parameters.iteritems()]) 

    return arg1.get_full_path() 

それから私はこのようにそれを使用しています:

{{ request|url_without_parameter:'page' }} 

と高度な方法次のとおりです。URLのGET内の他のパラメータが存在しないとき

href="{{ request|url_without_parameter:'page' }}&page={{ obj.page }}" 

私の問題はあります。これにより、「/test&page=1」のようなURLが作成されます。

だから私はそのように、この仕事をするために別のフィルタを書かなければならなかった:私のurl_get_separatorフィルター付き

href="{{ request|url_without_parameter:'page' }}{{ request|url_get_separator }}page={{ obj.page }}" 

@register.filter(name='url_get_separator') 
def url_get_separator(arg1): 
    """ 
    Returns '?' or '&' if there are QUERY parameters in the URL 
    Use: 
     {{ request|url_get_separator }} 

    Args: 
     arg1: request 
    """ 
    return u'&' if arg1.META.get('QUERY_STRING', '') else u'?' 

このすべてはかなり醜いもので、読みにくく、維持するのが難しいものです。 URL内のGETの値を置き換えるだけの他の方法がありますか?

+1

django-url-tools、特に 'overload_params'と' del_params' [テンプレートタグ](https://bitbucket.org/monwara/django-url-tools#rst-header-id39)を試してみてください。 。 [この質問](http://stackoverflow.com/questions/16469224/django-template-tag-to-insert-or-replace-url-parameter)も参照してください。 – Alasdair

答えて

0

私はあなたはそれが存在する場合、私は_pjaxのparamをゴミ箱に気づくでしょう、すべてを保持するが、数値のハイパーリンクのページ番号を切り替えるには、すなわち、私のプロジェクト内のページネーションリンクのほとんどは、このタグを使用します。

@simple_tag 
def query_transform(request, **kwargs): 
    """usages: {% query_transform request page=1 %}""" 
    updated = request.GET.copy() 

    for k, v in kwargs.iteritems(): 
     updated[k] = v 

    # trash any pjax params, we never want to render those 
    try: 
     del updated['_pjax'] 
    except KeyError: 
     pass 

    return updated.urlencode() 

おそらく、似たようなものが欲しいと思うかもしれません。おそらく、欠けていた秘訣は、をrequest.GETという辞書で呼び出してURLではなく混乱させることでした。

関連する問題