Django - User.DoesNotExist не существует? - PullRequest
31 голосов
/ 12 мая 2009

Я пытаюсь заполучить Джанго. Я использую Pydev на Eclipse. Я написал простую страницу регистрации, которую я не могу заставить работать. Eclipse жалуется, что User.DoesNotExist не определен. Скорее всего, мне не хватает чего-то тривиального. Вот соответствующая часть кода:

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)
    ...

Ответы [ 7 ]

22 голосов
/ 12 мая 2009

Проблема действительно в PyDev, а не в вашем коде. То, что вы сделали, абсолютно правильно, но у IDE всегда будут проблемы с разрешением атрибутов в динамическом языке, таком как Python. В случае исключения DoesNotExist оно добавляется через __metaclass__, а не через обычное наследование объектов, поэтому PyDev вряд ли сможет его найти. Тем не менее, это должно определенно работать.

20 голосов
/ 08 сентября 2009

Я только что обнаружил, что у Pydev есть хороший обходной путь для этого.

Перейти к Окно > Предпочтения , затем Pydev > Редактор > Анализ кода .

Перейдите на вкладку Undefined и добавьте «DoesNotExist» в текстовое поле с заголовком . Считайте следующие имена глобальными .

7 голосов
/ 12 мая 2009

У Pydev есть обходной путь для таких случаев (когда элементы определены во время выполнения). Просто добавьте # @ UndefinedVariable в конце строки, которая вызывает предупреждение (или ctrl + 1 на клавиатуре, когда курсор находится в "DoesNotExist"), и он не будет жаловаться.

2 голосов
/ 12 мая 2009

Может ли Eclipse разрешать атрибуты, созданные во время выполнения, через __metaclass__ es?

Обратите внимание, что вы никогда не определяете DoesNotExist ни в одной из ваших моделей, и оно также не определяется в django.db.models.base.Model.

1 голос
/ 18 июня 2010

У меня та же проблема на Ubuntu в VirtualEnv, чтобы решить проблему, я использовал этот фрагмент.

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

В parituclar он создает пользовательские поля пользователя с кодом:

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
1 голос
/ 07 апреля 2010

Вы также можете решить ее по-другому: просто перейдите в класс User и добавьте @DynamicAttrs в строку документации.
Это скажет PyDev, что атрибуты класса добавляются динамически, и больше не будет жаловаться на «проблемы», такие как DoesNotExist.

0 голосов
/ 12 мая 2009

Eclipse жалуется, что User.DoesNotExist не определен.

Что вы подразумеваете под этим? Есть ли у вас ошибка Python и трассировка стека? Этот код должен работать (как в документации ). Похоже на проблему затмения. Просто запустите dev server и посмотрите, работает он или нет:

manage.py runserver
...