2010-07-31 3 views
0

Je suis nouveau sur Python & Django. Je souhaite autoriser les utilisateurs à créer de nouveaux objets et à associer chaque objet à l'utilisateur actuellement connecté. Donc, je pensais utiliser la méthode générique create_object - seulement je ne peux pas trouver la meilleure façon de le faire, donc c'est simple et sécurisé.Relier des objets Django créés génériquement avec des utilisateurs

Voici mon modèle:

class Book(models.Model): 
    user = models.ForeignKey(User, related_name='owner', 
     editable=False) 

    title = models.CharField(max_length=200, 
     help_text='A title for this entry') 

    author = models.CharField(max_length=200) 

C'est un modèle très simple - les utilisateurs peuvent saisir un titre de livre et l'auteur, et le champ « utilisateur » est défini comme non modifiable. Lorsque l'objet est créé, je veux que le champ utilisateur ait la valeur de l'utilisateur actuellement connecté. Est-ce que je peux faire ceci avec la méthode générique create_object? Quelle est la meilleure approche ici? Je ne veux pas utiliser un champ caché dans le formulaire car ce n'est évidemment pas sûr.

Merci

Répondre

2

je pense qu'il est impossible avec vue générique (je pourrais penser à une façon d'y parvenir, mais ce serait beaucoup plus compliqué que cela vaut la peine - en utilisant des signaux, GLOBALS et middleware). Vous devriez écrire votre propre vue qui manipulera la création d'objet de livre en utilisant ModelForm. Lisez à ce sujet here et here (docs Django).

Aussi, je pense que vous mal compris ce que related_name paramètre ne - maintenant, étant donné une instance de l'utilisateur que vous devrez écrire:

books = user.owner.all() 

pour obtenir la liste des livres de cet utilisateur. Il serait préférable de soit laisser related_name inchangé (la valeur par défaut est relatedmodelname_set, dans ce cas: user.book_set.all()) ou changer pour quelque chose de plus significatif, comme "books", qui vous permettra d'écrire:

books = user.books.all() 

et obtenir ce que vous voulez .

+0

Merci. Je ne savais pas s'il y avait un moyen facile de le faire, mais je vais juste faire un nouveau point de vue. Merci d'avoir clarifié le paramètre related_name. – Roger

Questions connexes