保存表单后如何将 many-to-many 字段设置为当前用户
How to set many-to-many field to current user after saving form
所以这是我的问题,我试图让当前登录的用户在处理表单时放入一个 manytomanyfield 字段。
Models.py
该模型在 manytomanyfield 中包含一个字段贡献者
class Property(models.Model):
title = models.CharField(max_length=250,verbose_name="Nom de l'établissement")
contributors = models.ManyToManyField(User, verbose_name="Liste des collaborateurs autorisés") # ManyToMany pour autoriser plusieurs "User" à y accéder
token = models.CharField(max_length=500,verbose_name="Token") # Token généré par nous ou via un app secret key
payday = models.CharField(max_length=500,verbose_name="Jour de paye", null=True, blank=True)
planning = models.ImageField('Planning', null=True, blank=True )
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('property-home')
为了创建一个 属性 我只是在模型表单中显示标题字段。
class CreateProperty(forms.ModelForm):
class Meta:
model = Property
fields = ['title',]
并处理表格 (views.py)
我正在尝试通过 request.user.pk
添加当前登录用户的 ID
def create_property(request):
if request.method == "POST":
form = CreateProperty(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.token = 'TOKEN_GENERATOR_SIMULATION'
instance.contributors = request.user.pk
instance.save()
messages.success(request, _(f"good"))
return redirect('create-property')
else:
messages.error(request, _(f"The form is invalid"))
return HttpResponseRedirect(reverse('create-property'))
else:
form = CreateProperty(instance=request.user)
form.contributors = request.user
args = {'form': form}
return render(request, 'create_property.html', args)
但是当我尝试创建 属性 时遇到错误:
TypeError at /property/create
Direct assignment to the forward side of a many-to-many set is prohibited. Use contributors.set() instead.
Request Method: POST
Request URL: http://localhost:8000/property/create
Django Version: 2.1.7
Exception Type: TypeError
Exception Value:
Direct assignment to the forward side of a many-to-many set is prohibited. Use contributors.set() instead
我要的是给一个用户创建一个属性,直接关联
ManyToMany 是一个集合,而不是单个值,请尝试将用户添加到其中。
instance.contributors.add(request.user)
或者,如果您想更改单个用户的当前贡献者集合,请按照错误提示使用 instance.contributors.set()
。
如错误所述,您可以使用 contributers.set()
而不是分配给它。您需要在实例保存后执行此操作。
instance.save()
instance.contributors.set([request.user.pk])
有关更多示例,请参阅 many-to-many relationships 上的文档。
所以这是我的问题,我试图让当前登录的用户在处理表单时放入一个 manytomanyfield 字段。
Models.py
该模型在 manytomanyfield 中包含一个字段贡献者
class Property(models.Model):
title = models.CharField(max_length=250,verbose_name="Nom de l'établissement")
contributors = models.ManyToManyField(User, verbose_name="Liste des collaborateurs autorisés") # ManyToMany pour autoriser plusieurs "User" à y accéder
token = models.CharField(max_length=500,verbose_name="Token") # Token généré par nous ou via un app secret key
payday = models.CharField(max_length=500,verbose_name="Jour de paye", null=True, blank=True)
planning = models.ImageField('Planning', null=True, blank=True )
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('property-home')
为了创建一个 属性 我只是在模型表单中显示标题字段。
class CreateProperty(forms.ModelForm):
class Meta:
model = Property
fields = ['title',]
并处理表格 (views.py)
我正在尝试通过 request.user.pk
添加当前登录用户的 ID def create_property(request):
if request.method == "POST":
form = CreateProperty(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.token = 'TOKEN_GENERATOR_SIMULATION'
instance.contributors = request.user.pk
instance.save()
messages.success(request, _(f"good"))
return redirect('create-property')
else:
messages.error(request, _(f"The form is invalid"))
return HttpResponseRedirect(reverse('create-property'))
else:
form = CreateProperty(instance=request.user)
form.contributors = request.user
args = {'form': form}
return render(request, 'create_property.html', args)
但是当我尝试创建 属性 时遇到错误:
TypeError at /property/create
Direct assignment to the forward side of a many-to-many set is prohibited. Use contributors.set() instead.
Request Method: POST
Request URL: http://localhost:8000/property/create
Django Version: 2.1.7
Exception Type: TypeError
Exception Value:
Direct assignment to the forward side of a many-to-many set is prohibited. Use contributors.set() instead
我要的是给一个用户创建一个属性,直接关联
ManyToMany 是一个集合,而不是单个值,请尝试将用户添加到其中。
instance.contributors.add(request.user)
或者,如果您想更改单个用户的当前贡献者集合,请按照错误提示使用 instance.contributors.set()
。
如错误所述,您可以使用 contributers.set()
而不是分配给它。您需要在实例保存后执行此操作。
instance.save()
instance.contributors.set([request.user.pk])
有关更多示例,请参阅 many-to-many relationships 上的文档。