97👍
You can’t call a function with parameters from the template. You can only do this in the view. Alternatively you could write a custom template filter, which might look like this:
@register.filter
def related_deltas(obj, epk):
return obj.get_related_deltas(epk)
So now you can do this in the template:
{% for i in channel_status_list %}
{{ i|related_deltas:3 }}
{% endfor %}
42👍
If the method doesn’t require any arguments, you can use the @property decorator and access it normally in the template.
class ChannelStatus(models.Model):
...
@property
def function_you_want_as_property(self):
mystring = ""
...
- [Django]-How to resolve "django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates: foo" in Django 1.7?
- [Django]-Django: Open uploaded file while still in memory; In the Form Clean method?
- [Django]-Name '_' is not defined
10👍
For > 1 argument, use simple tags:
@register.simple_tag
def related_deltas(obj, epk, second_arg):
return obj.get_related_deltas(epk, second_arg)
Template:
{% for i in channel_status_list %}
{% related_deltas i 3 4 %}
{% endfor %}
(Note the change of syntax from {{
to {%
)
Can take positional parameters (e.g. related_deltas i 3 second_arg=4 debug=true
).
- [Django]-What is pip install -q -e . for in this Travis-CI build tutorial?
- [Django]-Navigation in django
- [Django]-Creating my own context processor in django
6👍
If you find that there are too many properties running around everywhere or you have a template filter for every other method that you write, another solution was suggested on IRC thanks @FunkyBob. It’s a little well, erm, funky but it is nice in certain cases.
class MethodProxy(object):
"""For consolidating into 1 method the calling of methods with various single args
(suitable dictionary keys)
class MyModel(models.Model):
...
def magic(self, value):
# Free the ponies
def thing(self):
return MethodProxy(self.magic)
# Usage
>>> m = MyModel()
...
>>> m.thing['value'] == m.magic('value')
# template
{{ m.thing.value }}
"""
def __init__(self, method):
self.method = method
def __getitem__(self, key):
return self.method(key)
- [Django]-Fastest way to get the first object from a queryset in django?
- [Django]-Specifying limit and offset in Django QuerySet wont work
- [Django]-ImportError: Failed to import test module:
0👍
Another option is to define a property.
See https://web.archive.org/web/20160407103752/http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/ .
You write your function that can do pretty much anything you want.
You make it a read only property.
You call the property from the template.
Et voilà !!!!
- [Django]-Update only specific fields in a models.Model
- [Django]-Django models.py Circular Foreign Key
- [Django]-Django template includes slow?