1

私のプロジェクト管理アプリには、データベース内のすべてのプロジェクトを一覧表示するページがあります。たとえば、ユーザーが管理者であるプロジェクトのみが表示されるように、プロジェクトをフィルタリングできるようにしたいと考えています。以下のテンプレートのコードは、ユーザーがクリックしたものに応じて異なる引数で project_list ビューを呼び出します。

私が助けを必要としているのは、下のビューの矢印が指しているクエリです。つまり、ユーザーがメンバーであるプロジェクトのみを表示し、ユーザーが管理者でもメンバーでもないすべてのプロジェクトを表示します。

テンプレート:

<h5>Show only projects where you are:</h5>
<div id="filter_div">
    <a class="btn btn-success" href="{% url project_list 'admin' %}">Admin</a>
    <a class="btn btn-info" href="{% url project_list 'member' %}">Member</a>
    <a class="btn" href="{% url project_list 'not_member' %}">Not member</a>
</div>

景色:

def project_list(request, projects_to_show='All'):
    if projects_to_show == 'admin':
        projects = get_list_or_404(Project.objects.filter(added_by_user = user))
    else:
        if projects_to_show == 'member':
            projects = get_list_or_404(?) // <- only projects where user is a member
        else:
            if projects_to_show == 'not_member' :
                projects = get_list_or_404(?) // <----- only projects where user is NOT admin OR member

        projects = get_list_or_404(Project.objects.order_by('name')) // <- all projects (works)

    return render(request, 'projects/list.html', {"projects" : projects, "headline" : "All projects"})

モデル 'Project' と 'User' には多対多の関係があります (つまり、テーブル project_users がデータベースに存在します)。これはプロジェクト モデルです。

class Project(models.Model):
    ... the rest of the fields...   
    added_by_user = models.ForeignKey(User)
    users = models.ManyToManyField(User, related_name='projects')
4

1 に答える 1

1

以下に修正: フィルターは次のように設定する必要があります ... (それに応じてテキストを変更しました)

users__id__iexact=user.id

のクエリは次のprojects_to_show == 'member'ようになります。

projects = Projects.objects.filter(users__id__iexact=user.id)

最後のものについてprojects_to_show == 'not_member'考えると、これはうまくいくと思います:

projects = Projects.objects.exclude(users__id__iexact=user.id)

ユーザーと added_by_user の両方を除外するには、exclude を追加するだけです。例えば:

projects = Projects.objects.exclude(users__id__iexact=user.id)
projects = projects.exclude(added_by_user=user)

または、1 つのステートメントとして、これは機能するはずです。

projects = Projects.objects.exclude(users__id__iexact=user, added_by_user=user)

フィルタはフィールド ルックアップです。ジャンゴの詳細。

于 2013-03-04T18:51:27.807 に答える