In A Django Template, How To Specify A Dictionary Key Which Is Itself An Attribute?
Solution 1:
So it basically boils down to not submitting keys in the GET request that have an empty string value. This appears to be unsupported natively in HTML; you need some JS magic to make this happen. See this thread: How to prevent submitting the HTML form's input field value if it empty
However, a pure Django solution would be to modify your filter dict to exclude keys that are null. I am not sure how you are filtering this in Django, but assuming you have override the get_queryset
method; you can always do:
defget_queryset(self):
qs = super(YourView, self).get_queryset()
filters = {k, v for k, v in request.GET.items() if v != ''} # Be as generic/specific as needed here for exclusion
qs = qs.filter(**filters) # Fire your filtering logic here; this is a samplereturn qs
Solution 2:
I finally solved this by writing a custom get
filter as described in Django template how to look up a dictionary value with a variable:
from django importtemplateregister = template.Library()
@register.filter
def get(dictionary, key):
return dictionary.get(key)
I updated _search.html
as follows:
{% load get %}
<form action="{% url action %}" method="get"class="left search col s6 hide-on-small-and-down" novalidate>
<divclass="input-field"><inputid="search"placeholder="{{ placeholder }}"autocomplete="off"type="search"name="q"value="{{ search_form.q.value.strip|default:'' }}"data-query="{{ search_form.q.value.strip|default:'' }}"><labelfor="search"class="active"><iclass="material-icons search-icon">search</i></label><idata-behavior="search-clear"class="material-icons search-icon"
{% ifnotsearch_form.q.value %}style="display: none;"{% endif %}>close</i></div>
{% if filter_form %}
{% for field in filter_form %}
<inputtype="hidden"name="{{ field.name }}"value="{{ request.GET|get:field.name }}"/>
{% endfor %}
{% endif %}
</form>
Now, if I try to search a filtered result, it works as expected:
Note that this also works fine for the filters that are not applied - these have the value None
instead of an empty string - without any need to filter them out in the form.
Post a Comment for "In A Django Template, How To Specify A Dictionary Key Which Is Itself An Attribute?"