我有profile
模型与User
模型有一对一的关系,所以我可以访问模板槽中的两个模型到user
变量,如下所示:
template.html
{% if user.profile.phone == 1234567890 %}
Show something
{% endif %}
工作正常,条件为True
并显示一些内容,但我也有模型Property
和User_Property
,User_Property
模型为Foreignkey
来自User
和Property
的ID。
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')
因此,如果我尝试像这样访问User_Property
模型:
{% if user.user_property.prop == 1 %}
Show something
{% endif %}
我无法访问它显示False
即使它True
也没有显示,我也试过了user.user_property.prop_id == 1
。因为Profile
模型与OneToOneField
建立了关系,与User_Property
的关系是ForeignKey
字段,我需要传入{context
1}} User_Property
模型?
如果我在模板中使用Property
SQL语句,可以访问JOIN
模型吗?像这样的东西:
{% if user.user_property.property.name == 'the name of the property' %}
Show something
{% endif %}
对于长篇帖子感到抱歉,但我尝试添加所有需求信息。
编辑:好的,如果有人需要类似的东西,这就是我为解决问题所做的工作。
创建context_processor.py
以返回User_Property
的实例,并以这种方式将其添加到我的settings.py
中,即使我没有通过,我也可以访问所有模板中的实例它作为观点中的背景。
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',)
然后在模板中检查用户是否具有特定属性
template.html
{% if 'property name' in user_property %}
Show something
{% else %}
This is not for you
{% endif %}
要查看name
而不是id
,请在模型to_field='name'
中的道具字段中添加User_Property
,如下所示:prop = models.ForeignKey(Property, related_name='up_prop', to_field='name')
答案 0 :(得分:1)
尝试一下:{% if user.user_property.prop.id == 1 %}
答案 1 :(得分:1)
您已在related_name
中设置了us = models.ForeignKey(User, related_name='up_us')
,因此您需要使用它
{% if user.up_us.prop.name == 'the name of the property' %}
Show something
{% endif %}
这个answer很好地解释了如何使用以及related_name
的用途。
并尝试从模板中排除很多逻辑。
答案 2 :(得分:1)
来自docs
您应该使用在related_name
中设置的ForeignKey
以及关系的内置方法:
试试这个:
user.up_us.filter(prop__name="the name")
修改强>
要使用.filter(prop__name="the name")
方法,您必须在.py
文件中执行此操作。