I have a profile model with a one-to-one relationship to the User model so I can access to both models in the templates tanks to the user variable like this:
template.html
{% if user.profile.phone == 1234567890 %}
Show something
{% endif %}
That works fine, the condition gives True and show something but I have too the models Property and User_Property, the User_Property model have as Foreignkey the ids from User and Property.
models.py
class Property(models.Model):
name = models.CharField(max_length=50, unique=True)
class User_Property(models.Model):
us = models.ForeignKey(User, related_name='up_us')
prop = models.ForeignKey(Property, related_name='up_prop')
So if I try to access to the User_Property model like this:
{% if user.user_property.prop == 1 %}
Show something
{% endif %}
I can't access it shows nothing like it was False even when it's True, I have tried with user.user_property.prop_id == 1 too. It is beacause the relationship with the Profile model was made with the OneToOneField and the relationship with User_Property was made with the ForeignKey field and I need to pass in the context the User_Property model?
And it is possible to access to Property model like if I use a JOIN SQL statement in the template? something like this:
{% if user.user_property.property.name == 'the name of the property' %}
Show something
{% endif %}
Sorry for the long Post but I tried to add all the need info.
EDIT: Ok if someone need something similar this is what I did to solve the problem.
Create a context_processor.py to return a instance of User_Property and add it to my settings.py in this way I can access to the instance in all my templates even if I don't pass it as context in the views.
context_processors.py
from App_name.models import User_Property
from django.contrib.auth.models import User
def access_prop(request):
user = request.user.id #add the .id to no have problems with the AnonymousUser in my logg-in page
user_property = User_Property.objects.filter(us=user).values_list('prop', flat=True) #this stores the list of all the properties for the logg-in user
return {
'user_property': user_property,
}
settings.py
from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS += ('App_name.context_processors.access_prop',)
Then in the template check if the user have a especific property
template.html
{% if 'property name' in user_property %}
Show something
{% else %}
This is not for you
{% endif %}
To can check in especific for the name instead of the id just add to_field='name' in my prop field in the model User_Property like this: prop = models.ForeignKey(Property, related_name='up_prop', to_field='name').