我正在尝试让登录的用户填写表格来创建组。在创建组时,我需要将用户自动添加到组中。
对于这个问题,我们正在使用两种模型 - 用户和组。
User是Django提供的默认模型。
组的定义如下:
class Group(models.Model):
name = models.CharField(max_length=255, unique=True)
admins = models.ManyToManyField(User, default=1, related_name='user_username')
all_users = models.ManyToManyField(User, default=1)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('home')
def get_admins(self):
return ", ".join([u.username for u in self.admins.all()])
def add_admin(self, user):
self.admins.add(user)
def get_all_users(self):
return ", ".join([u.username for u in self.all_users.all()])
def add_user(self, user):
self.all_users.add(user)
self.save()
def is_admin(self, user):
if user in self.admins.all():
return True
else:
return False
我试图重构的 View 是:
@login_required
def user_generated_group(request):
if request.method == 'POST':
form = GroupForm(request.POST)
user = request.user
if form.is_valid():
group = Group.objects.create(name=form.cleaned_data['name'])
group.add_admin(user)
group.add_user(user)
group.save()
return HttpResponseRedirect(reverse('home'))
else:
form = GroupForm()
context = {
'form': form,
'type': 'group',
'sidebar': Sidebar(request),
}
return render(request, 'form.html', context)
这是小组表格:
class GroupForm(forms.ModelForm):
class Meta:
model = Group
fields = '__all__'
exclude = ['all_users', 'admins', ]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['name'].widget.attrs.update({'class': 'input'})
目标是利用 Django 的内置 CreateView。到目前为止,重构的 View 如下所示:
class CreateGroup(LoginRequiredMixin, CreateView):
model = Group
form_class = GroupForm
template_name = 'form.html'
我尚未对此 View 实现 add_user 和 add_admin 逻辑。希望我可以在其他地方管理这些方法。
我不确定从这里该去哪里。这个逻辑应该由用户还是组来处理?
如果是团体,我应该使用经理吗?
如果由用户创建,我应该创建自定义用户模型吗?
最佳答案
您可以覆盖 form_valid
[Django-doc]方法,将 self.request.user
添加到组中,例如:
from django.http import HttpResponseRedirect
class CreateGroup(LoginRequiredMixin, CreateView):
model = Group
form_class = GroupForm
template_name = 'form.html'
def <b>form_valid</b>(self, form):
self.object = group = form.save()
<b>group.all_users.add(self.request.user)</b>
return HttpResponseRedirect(self.get_success_url())
关于python - 创建对象后将登录用户附加到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56817978/