[英]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.employee
和contract.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.