访问模板中带有外键的模型

时间:2016-03-01 20:04:48

标签: python html django django-models django-templates

我有profile模型与User模型有一对一的关系,所以我可以访问模板槽中的两个模型到user变量,如下所示:

template.html

{% if user.profile.phone == 1234567890 %}
    Show something
{% endif %}

工作正常,条件为True并显示一些内容,但我也有模型PropertyUser_PropertyUser_Property模型为Foreignkey来自UserProperty的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')

3 个答案:

答案 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文件中执行此操作。