1

すべてのページ ( base.html) で、request.user自分のクラスの管理者ロールがあるかどうかを確認UserTypesし、管理者リンクを表示したいと考えています。現在、私は次のようなことをしています:

{% if user.profile.user_types.all %}
    {% for user_type in user.profile.user_types.all %}
        {% if user_type.name == "ad" %}
            <li>
                <a href="{% url admin:index %}" class="round button dark ic-settings image-left">Admin</a>
            </li>
        {% endif %}
    {% endfor %}
{% endif %}

user.profileDjangoUserから私のUserProfile.

しかし、これは少し冗長で扱いにくいようです。もっと簡単な方法はありますか?たぶん、独自のカスタム コンテキスト プロセッサを作成して変数などを渡す必要があるかもしれませんがis_admin、これまでカスタム コンテキスト プロセッサを作成したことはありません...

4

1 に答える 1

6

is_adminモデルにメソッドを追加して、UserProfileビジネス ロジックをモデルに移動できます。

のような構造に注意してください

{% if user.profile.user_types.all %}
    {% for user_type in user.profile.user_types.all %}
    ...
    {% endfor %}
{% endif %}

あなたのデータベースに2つのSQLクエリをヒットします。しかし、withテンプレートタグはそれらを 1 ヒットに減らします。

{% with types=user.profile.user_types.all %}
{% if types %}
    {% for user_type in types %}
    ...
    {% endfor %}
{% endif %}
{% endwith %}

実際、これに最適な場所はモデルです。ただし、目的のために django が提供するもの (contrib.auth、パーミッション、ユーザー グループ) を学ぶ必要があります。おそらくあなたは車輪を再発明します。

次に、条件{% if user_type.name == "ad" %}を Python コード (特にテンプレート) にハードコーディングしないでください。

于 2012-05-07T19:04:39.040 に答える