2010-10-08 2 views
4

Je voudrais vérifier l'adresse IP lorsque les utilisateurs publient des commentaires django.Comment accéder à l'objet de requête lors de la validation d'un formulaire django.contrib.comments?

Je peux facilement remplacer et personnaliser le formulaire utilisé par django.comments, mais j'ai besoin d'accéder à l'objet de requête pour ajouter un test IP à son propre(). Est-il possible d'avoir accès à cela de manière propre? Une alternative pourrait être de vérifier l'adresse IP lors de la réception du signal de sauvegarde, mais la seule façon d'annuler l'enregistrement semble être de renvoyer un code 400 à l'utilisateur.

Répondre

0

Une façon possible, mais vous n'avez pas encore l'objet de la demande dans ce niveau de validation ...

class SomeForm(forms.ModelForm): 
    somefield = forms.CharField(...) 

    def check_somefield(self): 
     somefield = self.cleaned_data['somefield'] 
     ... #do what you want 
    return somefield 

espère que cela peut aider, ou je ne comprends pas ce que vous voulez correctement.

1

Les commentaires fournit un signal comment_will_be_posted: http://docs.djangoproject.com/en/1.2/ref/contrib/comments/signals/#comment-will-be-posted

Si vous vous inscrivez à ce signal, votre gestionnaire sera passé le (pas encore enregistré) l'objet de commentaire et la requête en tant qu'arguments. Si votre gestionnaire renvoie False, le post_comment affiche les réponses avec CommentPostBadRequest, comme il le fait pour tout autre type d'erreur, comme la validation de formulaire en échec.

+0

Cela fonctionnera, mais je voudrais retourner le formulaire avec un message informatif à l'utilisateur au lieu de lancer le CommentPostBadRequest qui retournera une erreur 400. – Hobhouse

+0

@Hobhouse: Alors la seule solution que je vois est de fournir votre propre version de 'post_comment'. L'implémentation dans 'django/contrib/comments/views/comments.py' ne semble pas fournir d'autres hooks pour votre objectif. Cependant, si vous vérifiez l'adresse IP pour des raisons de sécurité, il est probablement plus sûr de répondre simplement avec un statut 400. –

+0

@Hobhouse: OK, une autre solution pourrait être de fournir une classe middleware qui implémente une méthode 'process_request' qui stocke la requête en cours dans une variable locale. De cette façon, vous pouvez accéder à la demande en cours à partir de votre formulaire. Voir http://docs.djangoproject.com/fr/1.2/topics/http/middleware/#writing-your-own-middleware et http://docs.python.org/library/threading.html#threading.local –

Questions connexes