2012-03-15 2 views
1

참조 : How do I construct a Django reverse/url using query args?내 컨텍스트 변수가 제대로 렌더링되지 않는 이유는 무엇입니까?

이 먼저 move보기로 리디렉션됩니다 어떤 버튼을 클릭 한 후 somepage보기로 이동 somepage.html

<a href={% query_urls from={{from}} to={{to}} %}> LOL LOSER</a> 

입니다. 대신 http://localhost/web/move?from=./here.py&to=../mydir 같은 것을 얻기의

def move(request): 
    to = request.GET.get('to', 'None') 
    ffrom = request.GET.get('from', 'None') 
    #raise AssertionError(ffrom) 
    return render_to_response(request, "move.html", {'to': to, 'from': ffrom}) 

def somepage(request): 
    to = '../mydir' 
    ffrom = './heere.py' 
    return render_to_response(request, "somepage.html", {'to': to, 'from': ffrom}) 

내가 얻을이

http://localhost/web/move?from={{from}}&to={{to}}

그 컨텍스트 (somepage 뷰에 적용) 사용자 정의 태그가 소요 아마 때문에, 전혀 렌더링되지 않았다 바르 모든 매개 변수를 문자열로. 먼저 렌더링하려면 어떻게해야합니까?

감사합니다.


** 수정 ** 작은 질문 : 나는 템플릿

<a href={% query_url 'search' 12456 from=from to=to %}> MY LINK </a> 

에 넣고 경우의 일반적인 방법은 무엇이

url(r"^search/<?P(cbid)\d+>/", 'views.search', name='search') 

내가 Malformed arguments to query_urls tag을 얻을 달성하고자하는 경우 내 맞춤 태그를 작성하여 이것을 허용 하시겠습니까?

현재,이 ... 내가 어떤 작품 ... 무슨 내가 어떤 패턴, 단지 cbid하지 맞게, 좀 더 일반적인 만들고 싶어

def render(self, context): 
    view_name = self.view_name.resolve(context) 
    kwargs = dict([(smart_str(k, 'ascii'), v.resolve(context)) 
        for k, v in self.kwargs.items()]) 
    cbid = kwargs['cbid'] 
    kwargs = sorted(kwargs.items(), key=lambda x:x[0]) # sorted and generate a list of 2-tuple 
    # kwargs query set now contains no cbid 
    kwargs = [ value for index, value in enumerate(kwargs) if value[0] != 'cbid'] 

    #raise AssertionError(urllib.urlencode(kwargs)) 
    return (reverse(view_name, args=[(cbid),], current_app=context.current_app) 
      + '?' + urllib.urlencode(kwargs)) 

입니다.

<a href={% query_url 'search' cbid=12456 from=from to=to %}> MY LINK </a> 

바보 같은 방법으로 (그리고 아마도 유일한 방법은) 인수 그냥 일반 파이썬 함수로 인수 목록으로 그대로 촬영 템플릿

{% query_url 'view_func' args=[(cbid, some_text, more_text,)], from=foo to=bar %} 

이 뭔가를 작성하는 것입니다 . 아마도 eval을 리터럴 문자열 대신 목록에 넣을 수 있습니다.

+1

: 3 자세하게 모두 밖으로 철자가 {에서 %에 =로 =에서 %의 query_urls} 방금 작성해야이'' –

+0

@ GarthRees 감사합니다. 방금 해봤 어. 작동하지 않습니다. 그것은 내게 'from = from & to = to'을 제공합니다. – User007

+1

아, 알겠습니다. 당신이 링크 한 질문의 'myurl' 템플릿 태그를 사용하고 있습니다. 그것은 다양한 평가를하지 않습니다. 나는 상세한 대답을 쓸 것이다. –

답변

2

난 당신이 전화하고있는 query_url 템플릿 태그는 answer you linked to에서 myurl 태그 있다고 가정합니다. 해당 템플리트 태그는 템플리트 컨텍스트에 대한 인수를 분석하지 않습니다. 시도해 볼 수있는보다 완벽한 구현 방법은 쿼리 인수를 추가 할 URL을 얻기 위해 reverse 조회를 수행하는 것입니다.

from django import template 

register = template.Library() 

@register.simple_tag 
def query_url(view_name, **kwargs): 
    """ 
    Returns an absolute URL matching given view, with query parameters 
    appended. For example, if you have this URL in your configuration: 

     ('^search/$', 'myapp.search') 

    then in a template you can create a search link like this: 

     {% query_url 'myapp.search' q=value1 id=value2 %} 

    The first argument is a path to a view. The other arguments become 
    query parameters, so the URL will look something like: 
    ``/search/?q=querystring&id=123``. 
    """ 
    return reverse(view_name) + '?' + urllib.urlencode(kwargs) 

그러나 장고 1 :

장고 1.4에서이 the simple_tag decorator의 간단한 사용하는 것입니다.은`{{}}`템플릿 태그에 대한 필요가 없습니다

from django import template 
from django.core.urlresolvers import reverse 
from django.template import Library, Node, TemplateSyntaxError 
from django.utils.encoding import smart_str 
import re 
import urllib 

register = template.Library() 

class QueryURLNode(Node): 
    def __init__(self, view_name, kwargs): 
     self.view_name = view_name 
     self.kwargs = kwargs 

    def render(self, context): 
     view_name = self.view_name.resolve(context) 
     kwargs = dict([(smart_str(k, 'ascii'), v.resolve(context)) 
         for k, v in self.kwargs.items()]) 
     return (reverse(view_name, current_app=context.current_app) 
       + '?' + urllib.urlencode(kwargs)) 

@register.tag 
def query_url(parser, token): 
    """ 
    Returns an absolute URL matching given view, with query parameters 
    appended. For example, if you have this URL in your configuration: 

     ('^search/$', 'myapp.search') 

    then in a template you can create a search link like this: 

     {% query_url 'myapp.search' q=object.name id=object.id %} 

    The first argument is a path to a view. The other arguments become 
    query parameters, so the URL will look something like: 
    ``/search/?q=name&id=123``. 
    """ 
    bits = token.split_contents() 
    if len(bits) < 2: 
     raise TemplateSyntaxError("'%s' takes at least one argument" 
            " (path to a view)" % bits[0]) 
    viewname = parser.compile_filter(bits[1]) 
    kwargs = {} 
    kwarg_re = re.compile(r"(\w+)=(.+)") 
    for bit in bits[2:]: 
     match = kwarg_re.match(bit) 
     if not match: 
      raise TemplateSyntaxError("Malformed arguments to %s tag" % bits[0]) 
     name, value = match.groups() 
     kwargs[name] = parser.compile_filter(value) 
    return QueryURLNode(viewname, kwargs) 
+0

+1 멋진 데모! – CppLearner

+0

감사. 왜 우리는'parser.compile_filter'를 사용합니까 ?? 그게 뭐야? 감사. – User007

+1

"변수 토큰과 옵션 필터를 구문 분석하는"[FilterExpression]] (https://code.djangoproject.com/browser/django/trunk/django/template/base.py#L507) 개체를 생성합니다. 따라서 태그에 대한 인수에 템플릿 필터를 사용할 수 있습니다 :'{% query_url 'myapp.view'a = var | upper b = var | truncatechars : 10 %}'또는 무엇이든. –

관련 문제