2010-11-29 13 views
0

Je vais essayer de donner autant d'informations que je peux sans donner plus que ce dont j'ai besoin.Django: Lier une classe à une autre classe avec une clé étrangère lorsqu'elle est créée par le formulaire

J'ai une classe « Livre » qui, entre autres domaines, est liée à une autre classe « Utilisateur », comme ceci:

from users.models import User 
class Book(models.Model): 
    title = models.CharField(max_length=150)  
    owner = models.ForeignKey('users.User') 

Ce « livre » est créé par une forme, qui est codé comme si:

from django import forms 
from books.models import Book 
class BookForm(forms.ModelForm): 
    class Meta: 
     model = Book 
     fields = ["title"] 

ce formulaire est affiché avec un modèle qui ressemble à:

<form method="post" action=""> 
     {% csrf_token %} 
     {{ form.as_p }} 
     <input type="submit" /> 
    </form> 

qui est appelé par le followin g Vue:

def create_book(request): 
    if request.user is None: 
     return redirect("https://stackoverflow.com/users/login/") 
    if request.method == "POST": 
     form = BookForm(request.POST) 
     if form.is_valid(): 
      form.owner = request.user # FFFFFUUUUUUU 
      form.save() 
      return redirect("/books/") 
    else: 
     form = BookForm() 
    return render_to_response("books/create.html", { 
     "form": form, 
    }, context_instance=RequestContext(request)) 

Lorsque ce formulaire est soumis, il devrait mettre le livre dans la base de données, mais je reçois une erreur: IntegrityError at /books/create/ null value in column "owner_id" violates not-null constraint

J'imagine que je ne suis pas le propriétaire correctement mise. En ce qui concerne ce qui précède, form.owner = request.user, le bit request.user est mis en place par le middleware: de users.models importer utilisateur

class UserMiddleware(object): 
    def process_request(self, request): 
     user_id = request.session.get("user_id") 
     if user_id is not None: 
      request.user = User.objects.get(pk=user_id) 
     else: 
      request.user = None 

Il doit donc être un utilisateur valide (je peux vérifier Je suis connecté par d'autres fonctionnalités dans mon code). Je suis très nouveau sur Python/Django et je parie que ma façon de définir le propriétaire du nouveau livre n'est pas correcte, mais peut-être que quelque chose d'autre ne va pas. Si plus d'informations sont nécessaires, s'il vous plaît faites le moi savoir, et j'espère que ce n'est pas trop!

Merci pour l'aide.

Répondre

1

Vous devez définir l'utilisateur sur l'objet book créé en enregistrant le formulaire, pas sur le formulaire lui-même. Le code doit être:

if form.is_valid(): 
     book = form.save(commit=False) 
     book.owner = request.user 
     book.save() 

Faire form.save(commit=False) renvoie une instance book non enregistré, que vous pouvez modifier vous-même avant de l'enregistrer à la base de données.

+0

Parfait, merci pour l'aide! – Joseph