Как установить поле «многие ко многим» для текущего пользователя после сохранения формы - PullRequest
2 голосов
/ 20 марта 2019

Так вот в чем моя проблема, я пытаюсь заставить текущего вошедшего в систему пользователя вставить поле manytomanyfield при обработке формы.

Models.py

Модель содержит полеcontributors in 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

    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

Я хочу, чтобы пользователь создал свойство, оно напрямую связано.

Ответы [ 2 ]

3 голосов
/ 20 марта 2019

Как говорится в сообщении об ошибке, вы можете использовать contributers.set() вместо присвоения ему.Вы должны сделать это после , экземпляр был сохранен.

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

См. Документы по отношениям "многие-ко-многим" для получения дополнительных примеров.

2 голосов
/ 20 марта 2019

ManyToMany - это коллекция, а не одно значение, попробуйте добавить в него пользователя.

instance.contributors.add(request.user)

Или, если вы хотите изменить текущую коллекцию авторов одним пользователем, используйте instance.contributors.set(), как говорится в сообщении об ошибке.

...