0

環境:Python 2.7.3 || Django 1.4.1

ログインしたユーザーの役割に基づいて、Webページのメニューオプションを制限しようとしています。モデルにUserProfileクラスを作成し、ドキュメントに記載されているようにUserにリンクしました(ユーザーを追加する場合、Django Adminで完全に機能します)。たとえば、通常のユーザーには「ホーム」と「mytasks」のみがあり、管理者ユーザーには「ドメインタスク」もあります。

base.htmlテンプレートのコードは次のとおりです。

{% if user.get_profile.role == "Admin" %}
    <ul id="nav">
    <li><a href="{% url home %}">Home</a></li>
    <li><a href="{% url mytasks %}">My Tasks</a></li>
    <li><a href="{% url domaintasks %}">Domain Tasks</a></li>
    </ul>

上記は、サイト全体のナビゲーションバーをレンダリングするときにチェックされます。

問題は文字列をデータベースオブジェクト(以下に印刷)と比較することだと思いますが、比較を機能させる方法を見つけることができませんでした。

>>> b = Role.objects.all()
>>> print b
[<Role: Admin>, <Role: User>]
4

3 に答える 3

0

問題を解決する正しい方法は、ユーザーのサインアップ時にdjango adminがこれらのグループを割り当て、既存のユーザー用のスクリプトを作成し、in_groupテンプレートフィルターを使用してチェックすることで、ユーザーのタイプごとにグループを作成することです。ユーザーには必要な権限があります。

しかし、あなたのアプローチでは、ロールは文字列を返すuserprofileクラスの属性または関数ですか?もしそうなら、私はあなたのコードが機能するはずだと思います。ただし、役割が別のモデルの外部キーオブジェクトである場合は、次のようなものを使用して比較する必要があります。-

user.get_profile.role.attribute_in_the_other_model
于 2012-10-18T07:47:11.730 に答える
0

別のアプローチは、ロールモデルの文字列表現メソッドを呼び出すことです

{% if user.get_profile.role.__str__ == "Admin" %}

また

{% if user.get_profile.role.__unicode__ == "Admin" %}
于 2012-10-18T08:36:42.527 に答える
0

それを行うには2つの方法があります。

  • Role実行中のオブジェクトではなく、の適切な属性と照合します。したがって、にname属性がRoleある場合は、次のように確認できます。

{% if user.get_profile.role.name == "Admin" %}

  • モデルのコードを変更できる別Roleの方法は、モデルにメソッドを実装して、Role役割が管理者であるかどうかを確認し、それをテンプレートで使用することです。

{% if user.get_profile.role.is_admin %}

于 2012-10-18T08:08:12.820 に答える