2011-12-05 3 views
0

J'ont des vues:modèles Django: comportement inattendu

def finish_creation(request, pre_id): 
    pre_post = PrePost.objects.get(pk = pre_id) 
    if pre_id == pre_post.id: 
     this = Post.objects.create(
      author = pre_post.author, 
      title = pre_post.title, 
      text = pre_post.text 
     ) 

     this.pswd = some_password 
     this.save() 
     pre_post.delete() 
     return HttpResponseRedirect(this.get_absolute_url()) 

Explication: utilisateur non autorisé (auteur) peut écrire des messages sur le site, mais d'abord crée une pre_post temporaire dans la base de données et envoie un courrier électronique à l'auteur avec lien dans ce activer (transférer temporairement pre_post à poste permanent). Après suivre un lien crée Post à partir des éléments PrePost, PrePost supprime de la base de données et l'utilisateur redirige automatiquement vers sa publication.

Mais il y a erreur: Pre_Post matching query does not exist.

Mais tout le reste est OK:

1) Poste crée parfaitement,

2) Pre_post supprime parfaitement,

et seulement return HttpResponseRedirect(this.get_absolute_url()) doesn ne fonctionne pas ...

Cependant, erreur page se réfère à la première ligne dans les vues pre_post = PrePost.objects.get(pk = pre_id)

Comment cela pourrait-il être?

Merci.

ÉDITÉ:

Mais quand je ne l'ai pas supprimer pre_post tout a bien fonctionné comme prévu (sauf suppression de pre_post). Quel est le problème avec cette suppression()?

Répondre

2

C'est vraiment une mauvaise conception pour commencer. Vous ne devez pas déplacer les données d'une table à une autre pour les publier. Ajoutez simplement un champ à un modèle. Par exemple:

class Post(models.Model): 
    ... 
    approved = models.BooleanField(default=False) 

Ensuite, vous pouvez écrire un gestionnaire personnalisé pour tirer les messages Approuvés:

class PostManager(models.Manager): 
    def approved(self): 
     return self.filter(approved=True) 

class Post(models.Model): 
    ... 
    objects = PostManager() 

Enfin, dans vos vues et modèles, il suffit d'utiliser Post.objects.approved(), au lieu de Post.objects.all(). Ainsi, seuls les postes approuvés seront affichés sur le site.

Vous pouvez ensuite afficher uniquement le champ approved dans vos formulaires lorsque l'utilisateur est un super-utilisateur ou toute autre désignation que vous souhaitez, et qu'il sera le seul à pouvoir le marquer comme approuvé.

Vous pouvez également le faire de plusieurs autres façons, comme un statut "Publié" que seuls les superutilisateurs peuvent définir, etc., mais c'est l'idée générale.

EDIT Le problème avec votre code actuel est qu'il existe toujours la possibilité qu'un objet n'existe pas. Vous devez expliquer cette possibilité par toujours appels d'emballage à get dans try...except blocs:

try: 
    pre_post = PrePost.objects.get(pk = pre_id) 
except PrePost.DoesNotExist: 
    # Do something or... 
    pass 
else: 
    # object exists; you can do stuff with it here. 
+0

Oui, je comprends, mais si je dois le faire, ce qui peut se tromper dans mon code? –