2009-05-12 4 views
27

J'essaie d'obtenir Django. J'utilise Pydev sur Eclipse. J'ai écrit une page d'inscription simple que je ne peux pas me rendre au travail. Eclipse se plaint que User.DoesNotExist n'est pas défini. Très probablement, il me manque quelque chose de trivial. Voici la partie pertinente du code:Django - User.DoesNotExist n'existe pas?

from django.contrib.auth.models import User 
... 
class SignUpForm (forms.Form): 
    ... 
    def clean_username (self): 
     try: 
      User.objects.get(username=self.cleaned_data['username']) 
     except User.DoesNotExist: 
      return self.cleaned_data['username'] 
     raise forms.ValidationError(USERNAME_ALREADY_IN_USE) 
    ... 
+12

+1 pour le titre de la question. – OregonGhost

+0

Avez-vous essayé d'exécuter le code?Est-ce juste une plainte de pydev ou ça ne marche pas du tout? – miles82

+0

cela fonctionne, mais à moins que je sors le code, il ne me laisse pas déboguer sur pydev. – shanyu

Répondre

17

Le problème est vraiment avec PyDev, pas votre code. Ce que vous avez fait est absolument correct, mais les EDI auront toujours de la difficulté à résoudre les attributs dans un langage dynamique comme Python. Dans le cas de l'exception DoesNotExist, il est ajouté via un __metaclass__ plutôt que par l'héritage d'objet normal, donc PyDev est peu susceptible de le trouver. Cependant, cela devrait certainement fonctionner.

+1

je vous remercie pour la perspicacité. cela fonctionne, cependant il y a un effet secondaire très pénible de ce problème: je ne peux pas déboguer sur pydev! il est intéressant que lorsque je prends la partie hors du code, je puisse déboguer de façon transparente. Anty suggestions? – shanyu

+2

suggestion: n'utilisez pas un IDE avec des langages dynamiques. – muhuk

+3

suggestion: utiliser PyCharm –

2

Eclipse peut résoudre des attributs créés par l'exécution __metaclass__ es?

Notez que vous ne définissez jamais un DoesNotExist sur l'un de vos modèles et qu'il n'est pas défini sur django.db.models.base.Model non plus.

0

Eclipse se plaint que User.DoesNotExist n'est pas défini.

Qu'entendez-vous par là? Avez-vous une erreur python et une trace de pile? Ce code doit fonctionner (comme dans documentation). On dirait un problème d'éclipse. Il suffit de lancer le serveur dev et voir si cela fonctionne ou non:

manage.py runserver 
7

Pydev a une solution de contournement pour de tels cas (lorsque les membres sont définis lors de l'exécution). Ajoutez simplement # @ UndefinedVariable à la fin de la chaîne qui provoque l'avertissement (ou ctrl + 1 sur le clavier lorsque le curseur est sur "DoesNotExist"), et il ne se plaindra pas.

19

Je viens de découvrir que Pydev a une bonne solution pour cela.

Aller à la fenêtre > Préférences , puis Pydev>Editor>Analyse du code.

Cliquez sur l'onglet Undefined et ajouter « DoesNotExist » à la zone de texte intitulé Tenir compte les noms suivants comme GLOBALS.

+0

Merci beaucoup - ces soulignements rouges et ondulés m'embarrassent depuis des lustres :) – Jiaaro

+0

Merci pour ça. Je ne faisais que l'ignorer et l'écrire à la craie sur Python vs. Eclipse et être un langage dynamique, etc. +1 – DrBloodmoney

+1

Heureux d'être de service :) Voici à quoi ressemble ma boîte complète "Considérer comme globaux": _, tr, DoesNotExist , MultipleObjectsReturned, base_fields, _meta, ops, outbox – SmileyChris

1

Vous pouvez également le résoudre différemment: allez dans la classe User et ajoutez @DynamicAttrs dans la docstring. Ceci indiquera à PyDev que les attributs de la classe sont ajoutés dynamiquement, et ne le fera plus se plaindre pour des "problèmes" comme DoesNotExist.

1

J'ai le même problème sur Ubuntu dans un VirtualEnv pour résoudre le problème que j'ai utilisé ce snippets.

http://djangosnippets.org/snippets/191/#c3091

En parituclar il fait l'utilisateur des champs personnalisés avec le code:

class UserField(forms.CharField): 
    def clean(self, value): 
     super(UserField, self).clean(value) 
     try: 
      User.objects.get(username=value) 
      raise forms.ValidationError("Someone is already using this username. Please pick an other.") 
     except User.DoesNotExist: 
      return value 
Questions connexes