gpt4 book ai didi

python - Django Forms 在 ManyToMany 字段中保存 request.user

转载 作者:行者123 更新时间:2023-12-01 01:47:42 27 4
gpt4 key购买 nike

我有一个可以添加用户的简单组模型。

class Group(models.Model):
name = models.CharField(max_length=50)
users = models.ManyToManyField(settings.AUTH_USER_MODEL)
created_by = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
related_name='admin_on_group')

date_created = models.DateTimeField(auto_now_add=True)
date_modifies = models.DateTimeField(auto_now=True)

def __str__(self):
return self.name

我有一个用于该组的基本CreateView。创建群组的登录用户将保存在 created_by 字段中。不过,我还想在 users 字段中保存相同的登录用户,以便他可以作为该组的普通成员参与。问题是 View 最终仅保存登录的用户,而从表单字段 users 传入的其他用户未保存。

例如,如果名为“george”的用户创建了一个组,则他也应该添加到 created_byusers 中。截至目前,当我在表单中选择其他用户时,只有乔治会保存在这两个字段中。

class GroupCreateView(CreateView):

form_class = GroupForm
template_name = "groups/group_create.html"

def form_valid(self, form):
form = form.save(commit=False)
form.created_by = self.request.user

form.save()

# Apparently you can only add M2M relationships saves after first
# saving
form.users.add(User.objects.get(pk = self.request.user.pk))
return HttpResponseRedirect(reverse('group_list'))

def get_form_kwargs(self):
kwargs = super(GroupCreateView, self).get_form_kwargs()
kwargs['user'] = self.request.user

return kwargs

我有一个具有以下轮廓的 modelForm。注意:下面的 self.fields['users'] 中传递的初始数据也不会显示。我还使用了一个自定义模型,其中的 USERNAME_FIELD 为phone_number。 self.fields['users'] 中传递的查询集有效。

class UserModelChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
return obj.get_full_name()


class GroupForm(forms.ModelForm):

class Meta:
model = Group
fields = ('name', 'users', )

def __init__(self, *args, **kwargs):
# popping the user from kwargs dictionary that has been
# passed in CreateView
user = kwargs.pop('user', None)

self.user = user # setting self.user to be equal to user above

super(GroupForm, self).__init__(*args, **kwargs)

self.fields['users'] = UserModelChoiceField(
queryset=User.objects.exclude(phone_number=str(user)),
initial=User.objects.get(phone_number=str(user))
)

最佳答案

既然你已经 saved the form使用commit=False,您需要在保存实例后调用表单的save_m2m()方法来保存多对多数据。

def form_valid(self, form):
instance = form.save(commit=False)
instance.created_by = self.request.user
instance.save()
form.save_m2m()
# Apparently you can only add M2M relationships saves after first
# saving
instance.users.add(self.request.user)
return HttpResponseRedirect(reverse('group_list'))

请注意,我已将该行更改为 instance = form.save(commit=False) ,以更清楚地表明 save() 返回一个实例,因此您仍然可以访问该表单。

关于python - Django Forms 在 ManyToMany 字段中保存 request.user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51082873/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com