2009-05-12 10 views
27

Próbuję zdobyć Django. Używam Pydev na Eclipse. Napisałem prostą stronę rejestracji, której nie mogę uruchomić. Eclipse skarży się, że User.DoesNotExist jest niezdefiniowana. Najprawdopodobniej brakuje mi czegoś trywialnego. Oto odpowiedni fragment kodu:Django - User.DoesNotExist nie istnieje?

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 na tytułowe pytanie. – OregonGhost

+0

Czy próbowałeś już uruchomić kod?Czy to tylko pydev narzeka, czy to w ogóle nie działa? – miles82

+0

to działa, ale jeśli nie wyślę kodu, nie pozwala mi debugować pydev. – shanyu

Odpowiedz

17

Problem jest naprawdę z PyDev, a nie z twoim kodem. To, co zrobiłeś, jest absolutnie poprawne, ale IDE zawsze będą miały trudności z rozwiązywaniem atrybutów w dynamicznym języku, takim jak Python. W przypadku wyjątku DoesNotExist jest on dodawany przez __metaclass__ zamiast przez normalne dziedziczenie obiektów, więc PyDev najprawdopodobniej nie będzie w stanie go znaleźć. Powinno jednak zdecydowanie działać.

+1

dziękuję za wgląd. działa, ale jest bardzo bolesny efekt uboczny tego problemu: nie mogę debugować na pydev! interesujące jest to, że gdy wyjmę część z kodu, mogę bez problemu debugować. anty sugestie? – shanyu

+2

sugestia: Nie używaj IDE z dynamicznymi językami. – muhuk

+3

sugestia: użyj PyCharm –

2

Czy Eclipse atrybuty rozwiązywaniu utworzone czas pracy poprzez __metaclass__ es?

Zauważ, że nigdy nie definiujesz modelu DoesNotExist w żadnym z modeli i nie jest on zdefiniowany również na django.db.models.base.Model.

0

Eclipse skarży się, że User.DoesNotExist jest niezdefiniowana.

Co masz na myśli? Czy masz błąd Pythona i śledzenie stosu? Ten kod musi działać (jak w documentation). Wygląda na problem z zaćmieniem. Po prostu uruchom serwer dev i sprawdź, czy działa, czy nie:

manage.py runserver 
7

Pydev ma sposób obejścia takich przypadków (gdy członkowie są zdefiniowani w czasie wykonywania). Po prostu dodaj # @ UndefinedVariable na końcu łańcucha, który powoduje ostrzeżenie (lub ctrl + 1 na klawiaturze, gdy kursor jest ustawiony na "DoesNotExist"), i nie będzie narzekać.

19

Właśnie odkryłem, że Pydev rzeczywiście ma dobre obejście tego problemu.

idź do Okno>Preferencje, następnie PyDev>Editor>Code Analysis.

Kliknij niezdefiniowanej kartę i dodać „DoesNotExist” w polu tekstowym zatytułowanym Rozważmy następujące nazwiska jak globalnych.

+0

Dziękuję bardzo - te czerwone falujące podkreślenia podsłuchują mnie od wieków :) – Jiaaro

+0

Dzięki za to. Przeważnie po prostu ignorowałem i pisałem do Pythona kontra Eclipse i będąc dynamicznym językiem, itd. +1 – DrBloodmoney

+1

Cieszę się, że mogę być usługowy :) Oto, co wygląda moje pełne pole "rozważ jak globale": _, tr, DoesNotExist , MultipleObjectsReturned, base_fields, _meta, ops, outbox – SmileyChris

1

Możesz również rozwiązać go w inny sposób: po prostu przejdź do klasy Użytkownik i dodaj @DynamicAttrs w dokumencie.
To powie PyDev, że atrybuty klasy są dodawane dynamicznie i sprawią, że nie będzie już narzekać na "problemy", takie jak DoesNotExist.

1

Mam ten sam problem na Ubuntu w VirtualEnv, aby rozwiązać problem Użyłem tych fragmentów.

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

W parituclar on uczynić użytkownika niestandardowego pola z kodem:

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