python - 保存表单后如何为当前用户设置多对多字段

标签 python django modelform django-2.0 manytomanyfield

所以这是我的问题,我试图让当前登录的用户在处理表单时放入一个 manytomanyfield 字段。

模型.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

我想要的是为用户创建一个属性,它是直接关联的。

最佳答案

如错误所述,您可以使用 contributers.set() 而不是分配给它。您需要在实例保存后执行此操作。

instance.save()
instance.contributors.set([request.user.pk])

请参阅 many-to-many relationships 上的文档更多示例。

关于python - 保存表单后如何为当前用户设置多对多字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55266537/

相关文章:

python - 这个条件是如何处理的?

python - 如何从整数列表中选择几个最大值?

python - 如何将这个字符串拆分成它的单个字符?

django - 使用 ember-data + ember-data-django-rest-adapter 创建记录

django - 如何在 ModelForm 中访问请求以添加 request.user 作为外键

python - 如何使用 click.prompt 从用户那里获取有效日期?

python - Django DateTimeField 很幼稚,但 USE_TZ = True

python - 如何使用 Django ModelForm 将数据提交到数据库?

python - 在Django2.1中提交后如何获取modelform中的ckeditor字段值?

python - Django ModelForm 没有指定模型类