Django - Добавление записи в поле ManyToMany через представление на основе класса

Я хочу добавлять/удалять членов из модели Team. Члены указываются как поле ManyToManyField. Я использую django-rules для указания прав доступа, поэтому владельцы команды должны иметь возможность добавлять/удалять членов.

# models.py

from django.db import models
from rules.contrib.models import RulesModel
from django.conf import settings

class Team(RulesModel):
    name = models.CharField(max_length=80)
    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        help_text="Owner can view, change or delete this team.",
        related_name="team_owner",
    )
    members = models.ManyToManyField(
        settings.AUTH_USER_MODEL, blank=True, related_name="team_members"
    )

Разрешения задаются следующим образом:

import rules

@rules.predicate
def is_team_owner(user, obj):
    return obj.owner == user

rules.add_perm("teamapp.change_team", is_team_owner)

Я задал несколько общих представлений (CreateView, DetailView, UpdateView и DeleteView) для управления командой. Теперь мне нужны два отдельных представления для добавления и удаления членов одной команды.

# views.py

from django.views.generic import (
    CreateView,
    DetailView,
    UpdateView,
    ListView,
    DeleteView,
)
from rules.contrib.views import PermissionRequiredMixin
from django.contrib.auth import get_user_model
from .models import Team

class TeamMemberAddView(PermissionRequiredMixin, UpdateView):
    model = Team
    permission_required = "teamapp.change_team"
    raise_exception = True
    fields = ["members"]

    def form_valid(self, form):
        user = get_user_model()
        new_member = user.objects.get(pk=1)
        self.object.members.add(new_member)
        return super(TeamMemberAddView, self).form_valid(form)

Какое общее представление я могу использовать для добавления/удаления членов? Какой подход рекомендуется здесь? Я хотел 1 выделенное представление для выбора существующего пользователя для добавления, и несколько ссылок в представлении списка для удаления членов. Мой подход не работает, потому что он не добавляет членов, он только обновляет последнего выбранного пользователя. Поэтому таблица ManyToMany содержит только одну запись.

Вернуться на верх