Question

I have this models in Django:

News
Comments
Reactions

Relations are:

a News has various Comments
a Comment has various Reactions

The problem is the user (in request / session): the user may subscribe to a reaction, or a comment; he may be logged in or not. (it's a foo example, it doesn't have much sense)

I can't do in template:

{% for reaction in this_news.comments.reactions %}
 {{ reaction.name }}
 {% if reaction.user_subscribed %} #reaction.user_subscribed(request.user)...
 You have subscribed this reaction!
 {% endif %}
{% endfor %}

Problems are:

  • I can't call the method in the template with a parameter (see the comment above)
  • Models don't have access to request

Now i'm calling an init_user method in News Model, passing the request. Then i have the same method in Comment and Reaction model, and i have to set the user_subscribed property cycling the children of each model.

Isn't there a smarter way to do this?

EDIT: thanks to the Ignacio's hint about using custom tag i'm trying to do a generic mode to pass the user (avoiding the use of closures because i don't know how to use them atm):

def inject_user(parser, token):
    try:
        # split_contents() knows not to split quoted strings.
        tag_name, method_injected, user = token.split_contents()
    except ValueError:
        raise template.TemplateSyntaxError("%r tag requires exactly three arguments" % token.contents.split()[0])
    return InjectUserNode(method_injected, user)

class InjectUserNode(template.Node):
    def __init__(self, method_injected, user):
        self.method_injected = template.Variable(method_injected)
        self.user = template.Variable(user)

    def render(self, context):
        try:
            method_injected = self.method_injected.resolve(context)
            user = self.user.resolve(context)
            return method_injected(user)
        except template.VariableDoesNotExist:
            return ''

When i use it {% inject_user object.method_that_receives_a_user request.user %} i come to this error 'str' object is not callable in method_injected(user); how i can fix that?

Était-ce utile?

La solution 2

I've resolved it in a less elegant way, but it worked for me.

I've created a sort of singleton in my User defined class, with a property that i set in every view i need it.

The property is User.current.

Then, inside the models, where i need that i get the current user looking in User.current.

Autres conseils

Write custom template tags that take the user and set a context variable to indicate presence or absence of the criterion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top