2016-07-08 3 views
1

Ich überprüfe einen request.GET-Parameter in der Django-Vorlage. Ich habe einen Teil davon eingefügt:Anforderung überprüfen Parameter in Django-Vorlage abrufen

<dd> 
    <i class="fa fa-caret-right {% if request.GET.order %}{% ifequal request.GET.order 'price-asc' %}active{% endifequal %}{% endif %}"></i> <a href="{%url_add_replace request 'order' 'price-asc'%}">Order by price (Asc)</a> 
</dd> 

Wie Sie sehen, gibt es auch eine benutzerdefinierte Vorlage Tag mit dem Namen add_replace. Es fügt der URL den angegebenen GET-Parameter hinzu. Ich glaube nicht, dass das ein Problem darstellt.

Meine Frage geht um etwas anderes. Dieser Code generiert ein Protokoll auf DEBUG-Ebene. Und ich versuche, es loszuwerden. Das Protokoll ist unten. Ich denke, da muss etwas passender sein, um zu überprüfen, ob ein get-Parameter existiert oder nicht. Ich kann es in Ansichten tun:

get_dict = request.GET.copy() 

if get_dict.__contains__('order'): 
    get_order = get_dict.__getitem__('order') 
else: 
    get_order = None 

Aber wenn ich es in der Vorlage zu überprüfen, unter log auftritt:

DEBUG 2016-07-08 22:07:43,789 base 29571 140656761874496 Exception while resolving variable 'order' in template 'category.html'. Traceback (most recent call last): File "/usr/local/lib/python3.5/site-packages/django/utils/datastructures.py", line 83, in __getitem__ 
    list_ = super(MultiValueDict, self).__getitem__(key) KeyError: 'order' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): File "/usr/local/lib/python3.5/site-packages/django/template/base.py", line 883, in _resolve_lookup 
    current = current[bit] File "/usr/local/lib/python3.5/site-packages/django/utils/datastructures.py", line 85, in __getitem__ 
    raise MultiValueDictKeyError(repr(key)) django.utils.datastructures.MultiValueDictKeyError: "'order'" 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): File "/usr/local/lib/python3.5/site-packages/django/template/base.py", line 891, in _resolve_lookup 
    current = getattr(current, bit) AttributeError: 'QueryDict' object has no attribute 'order' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): File "/usr/local/lib/python3.5/site-packages/django/template/base.py", line 898, in _resolve_lookup 
    current = current[int(bit)] ValueError: invalid literal for int() with base 10: 'order' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): File "/usr/local/lib/python3.5/site-packages/django/template/base.py", line 905, in _resolve_lookup 
    (bit, current)) # missing attribute django.template.base.VariableDoesNotExist: Failed lookup for key [order] in '<QueryDict: {}>' 

Irgendwelche Ideen?

UPDATE: Ich bin Hinzufügen des benutzerdefinierten Vorlage Tag-Code:

@register.simple_tag(name='url_add_replace') 
def url_add_replace(request, field, value): 

    dict = request.GET.copy() 

    dict.__setitem__(field, value) 

    return u"?%s" % (dict.urlencode()) 

Antwort

0

ich mein Problem mit dem Schreiben einer anderen benutzerdefinierten Tages gelöst:

@register.simple_tag(name='active_request_get') 
def active_request_get(request, key, value): 

    dict = request.GET.copy() 

    if dict.__contains__(key): 

     if dict.get(key, default=None) == value: 
      return 'active' 

    return '' 

ich diese ersetzt:

<dd> 
    <i class="fa fa-caret-right {% if request.GET.order %}{% ifequal request.GET.order 'price-asc' %}active{% endifequal %}{% endif %}"></i> <a href="{%url_add_replace request 'order' 'price-asc'%}">Order by price (Asc)</a> 
</dd> 

mit diesem:

<dd> 
    <i class="fa fa-caret-right {% active_request_get request 'order' 'price-asc' %}"></i> <a href="{%url_add_replace request 'order' 'price-asc'%}">Order by price (Asc)</a> 
</dd> 

Also überprüfe ich die GET-Parameter wie ich will.

1

Ich denke, ein benutzerdefiniertes Template-Tag ist dafür Overkill. Die folgende Vorlage Logik sollte ohne Auslösung keine Debug-Protokolle arbeiten:

{% if 'order' in request.GET %} 
    {% ifequal request.GET.order 'price-asc' %}active{% endifequal %} 
{% endif %} 

Der Unterschied zwischen diesem und Ihrem ursprünglichen Code ist, dass die äußere if Block für die Existenz von order in GET prüft, anstatt die Bewertung der Truthiness von GET.order .

+0

danke für die Idee. Ich werde es so schnell wie möglich versuchen und die Ergebnisse teilen. – Jai

Verwandte Themen