| | 837 | def object_tag(self, func): |
| | 838 | """ |
| | 839 | Makes it easier to write template tags that load objects into the template. |
| | 840 | These tags are of the form (tag) [args] as (varname) |
| | 841 | For example: get_some_articles 5 as recent_articles |
| | 842 | |
| | 843 | object_tag should be used to decorate a function that takes [args] as its |
| | 844 | parameters and returns the object to be assigned to (varname) in the template. |
| | 845 | For example: |
| | 846 | @register.object_tag |
| | 847 | def get_some_articles(num): |
| | 848 | return MyArticleModel.objects.all()[:num] |
| | 849 | """ |
| | 850 | def compile_func(parser, token): |
| | 851 | bits = token.contents.split(None) |
| | 852 | tagname, bits = bits[0], bits[1:] |
| | 853 | if len(bits) < 2 or bits[-2] != "as": |
| | 854 | raise TemplateSyntaxError, "Tag must be of format %s [args] as (varname)" % tagname |
| | 855 | args, varname = bits[:-2], bits[-1] |
| | 856 | |
| | 857 | class ObjectTagNode(Node): |
| | 858 | def render(self, context): |
| | 859 | context[varname] = func(*args) |
| | 860 | return '' |
| | 861 | |
| | 862 | return ObjectTagNode() |
| | 863 | |
| | 864 | compile_func.__doc__ = func.__doc__ |
| | 865 | self.tag(func.__name__, compile_func) |
| | 866 | return func |
| | 867 | |