2017-04-26 10 views
0

誰かが私が間違って言ったことができますか?プロジェクトのテンプレートの現在のユーザーロールを表示するにはどうすればよいですか?

私はProjectモデルを持っています。すべてのプロジェクトにメンバーがいます。私は​​ページを持っています。現在のユーザーのユーザー名とプロジェクトでの彼の役割を表示します。テンプレートでは、現在のユーザーのユーザー名のみが表示されますが、プロジェクトでの役割はわかりません。

models.py:

class Project(models.Model): 
    members = models.ManyToManyField(User, through='Member', help_text=_('Members')) 

ROLE_CHOICES = (
    ('manager', _('Manager')), 
    ('developer', _('Developer')), 
    ('business_analyst', _('Business Analyst')), 
    ('system_analyst', _('System Analyst')), 
) 

class Member(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    project = models.ForeignKey(Project, on_delete=models.CASCADE) 
    role = models.CharField(max_length=20, choices=ROLE_CHOICES) 

views.py:

def project_detail(request, project_code): 
    project = get_object_or_404(Project, pk=project_code, status='open') 
    context = {'project': project,} 
    return render(request, 'project/project_detail.html', context) 

project_detail.html:

<span class="nav-link active navbar-text"> 
    {{ user.get_username }}: 

    {% for member in project.member_set.all %} 
     {% if member.user == user.get_username %} 
      {{ member.get_role_display }} 
     {% endif %} 
    {% endfor %} 
</span> 

答えて

2

なぜあなたは比較していますget_usernameの結果に対するユーザー?おそらくユーザー名文字列を返しますが、そのユーザーはユーザーです。これはうまくいく:

{% if member.user == user %} 
    {{ member.get_role_display }} 
{% endif %} 

しかし、これはしないでください。すべてのプロジェクトメンバーをループして、それぞれのユーザーを取得するのは非常に非効率です。代わりに、ビュー内で1つのクエリを実行してください:

member = project.member_set.get(user=request.user) 
context = {'project': project, 'role': member.get_role_display()} 
+0

ありがとうございます。 –

+0

テンプレートでもう1つ質問することはできますか?私はテンプレートで使用する必要がありますか?私はこれを '{{role}}'と呼んでいますか? –

+0

申し訳ありません。ビュー内の 'get_role_display()'メソッドを呼び出すことを意図しています。しかし、はい、ちょうどテンプレートで 'ロール'をしてください。 –

関連する問題