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 содержит только одну запись.