Django:两个外键给模型中的用户,得到一个不是加载pag的用户

2024-04-25 09:40:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个模型,大概是这样的:

class UserProfile(models.Model):
    account = models.ForeignKey(MyUser, related_name='profiles') # MyUser is my custom user model
    display_name = models.CharField(max_length=30)
    ...
    def get_all_contracts(self):
        #returns all contracts associated with the profile

class Contract(models.Model):
    ...
    employee = models.ForeignKey(UserProfile, related_name='employee_contracts')
    employer = models.ForeignKey(UserProfile, related_name='employer_contracts')
    ...

我想在合同模型中编写一个方法,返回不是访问视图的UserProfile实例,这样如果是访问仪表板的雇员,这个方法将返回雇主,反之亦然,这样我就可以像这样使用它:

{% for contract in user_profile.get_all_contracts %}
    <h2>The other user is {{ contract.other_user.display_name }}</h2>
{% endfor %}

在本例中,other_user将是方法。你知道吗

有办法吗?我不知道如何从方法中检测哪个配置文件是加载页面的配置文件。你知道吗

感谢您的帮助:)


Tags: 方法name模型modelismodelsallclass
1条回答
网友
1楼 · 发布于 2024-04-25 09:40:29

可以将其作为模板标记。比如:

from django import template

register = template.Library()

@register.simple_tag
def get_other_user_display_name(user, contract):
    try:
        return [obj for obj in [contract.employee, contract.employer] \
                if obj != user][0].display_name

        # if you don't like list comprehensions, you could do:
        # set([contract.employee, contract.employer]) - set([user])
        # but I find this syntax to be less than obvious
    except IndexError:
        return ''

然后在模板循环中:

{% for contract in user_profile.get_all_contracts %}
    <h2>The other user is {% get_other_user_display_name request.user contract %}</h2>
{% endfor %}

如果您100%确信contract.employeecontract.employer关系不会为空,那么可以消除IndexError异常处理程序。你知道吗

或者,如果需要访问other_user的其他属性,可以将其作为赋值标记来执行:

@register.assignment_tag(takes_context=True)
def get_other_user(context, contact):
    # you can get request.user from the context

    user = context['request'].user

    return [obj for obj in [contract.employee, contract.employer] if obj != user][0]

然后在循环中,您可以访问所需的任何属性。你知道吗

{% for contract in user_profile.get_all_contracts %}
    {% get_other_user contract as other_user %}
    <h2>The other user is {{ other_user.display_name }}</h2>
    <p>Their email is: {{ other_user.email }}</p>
{% endfor %}

相关问题 更多 >