簡體   English   中英

Django:模型中用戶的兩個外鍵,得到不是加載頁面的用戶的外鍵

[英]Django: two foreign keys to users in model, get the one that's not the user who loaded the page

我有兩個類似的模型:

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')
    ...

我想在Contract模型中編寫一個方法,該方法返回不是訪問視圖的UserProfile實例的UserProfile實例,這樣,如果是員工正在訪問儀表板,則此方法將返回雇主,反之亦然,以便我可以使用它像這樣:

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

在此示例中, other_user將是方法。

有沒有辦法做到這一點? 我無法弄清楚如何從該方法中檢測哪個配置文件是加載頁面的配置文件。

任何幫助表示贊賞:)

您可以將其用作模板標簽。 就像是:

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 %}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM