Question

So i have created a custom filter:

@register.filter(name='field_values')
def field_values(model, field):
    return model.objects.values_list(field, flat=True)

that takes model class value and a field for an argument and returns a list of model objects for that particular field. Here is the template where I try to call it.

<tr>
    {% for field in fields %}
            <td>{{ model_class|field_values: field }} </td>
     {% endfor %}
</tr>

model_class is a dynamically created model in the views as such

views.py
...
if form.is_valid(): # All validation rules pass
    model_classes_field = form.cleaned_data['model_classes_field']
    model_class = get_model('Directories', model_classes_field)

I was expecting everything to run smoothly but instead I get a "*field_values requires 1 arguments, 0 provided*" error. Why does this happen when i have already inserted an argument?? is it a problem with the filter syntax?

Was it helpful?

Solution

You have a space after the colon which is confusing the parser. Use it like this instead:

{{ model_class|field_values:field }}

(Note that your code is pretty inefficient: it's querying the database over and over again, once for each field. Rather than doing this, you should probably query it once in the view and group the output by field.)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top