0

Sur la base des exemples de https://docs.djangoproject.com/en/1.11/topics/class-based-views/generic-editing/#models-and-request-user - mais avec plusieurs à-plusieurs au lieu d'une relation clé étrangère:Vues Sur la base de la classe (CBV), createView et request.user avec plusieurs à-plusieurs

models.py

from django.contrib.auth.models import User 
from django.db import models 

class Author(models.Model): 
    name = models.CharField(max_length=200) 
    owners = models.ManyToManyField(User, related_name='owners_') 

views.py

from django.views.generic.edit import CreateView 
from myapp.models import Author 

class AuthorCreate(CreateView): 
    model = Author 
    fields = ['name'] 

    def form_valid(self, form): 
     form.instance.owners = self.request.user 
     return super(AuthorCreate, self).form_valid(form) 

Affichera

"<Author: test>" needs to have a value for field "id" before this many-to-many relationship can be used. 

Comment éviter cela?

Répondre

1

Modifier votre point de vue un peu comme ça,

class AuthorCreate(CreateView): 
    model = Author 
    fields = ['name'] 

    def form_valid(self, form): 
     self.object = form.save() 
     self.object.owners.add(self.request.user) 
     self.object.save() 
     return HttpResponseRedirect(self.get_success_url()) 

CreateView hérite de ModelFormMixin et FormMixin. Appeler super() ne ferait que sauver le modèle et rediriger vers le success_url. Dans le cas d'un ManyToManyField, un objet doit avoir primary_key avant de créer une relation ManyToMany (par exemple, l'objet doit être enregistré dans la base de données). Ainsi, en surchargeant la méthode form_valid() en appelant explicitement les méthodes des deux classes parentes, vous pouvez résoudre votre problème.