Django - User.DoesNotExist не существует?
Я пытаюсь заполучить Django. Я использую Pydev на Eclipse. Я написал простую страницу регистрации, на которой я не могу работать. Eclipse жалуется, что User.DoesNotExist undefined. Скорее всего, мне не хватает чего-то тривиального. Здесь соответствующая часть кода:
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)
...
Ответы
Ответ 1
Проблема действительно с PyDev, а не с вашим кодом. То, что вы сделали, абсолютно правильно, но для IDE всегда будет сложно разрешить атрибуты на динамическом языке, таком как Python. В случае исключения DoNotExist он добавляется через __metaclass__
, а не через обычное наследование объектов, поэтому PyDev вряд ли сможет его найти. Однако это определенно должно работать.
Ответ 2
Я только что обнаружил, что Pydev действительно имеет хороший обходной путь для этого.
Перейдите в Окно > Настройки, затем Pydev > Редактор > Анализ кода > .
Перейдите на вкладку Undefined и добавьте "DoNotExist" в текстовое поле . Рассмотрим следующие имена как глобальные.
Ответ 3
Pydev имеет обходное решение для таких случаев (когда члены определены во время выполнения).
Просто добавьте # @UndefinedVariable в конце строки, которые вызывают предупреждение (или ctrl + 1 на клавиатуре, когда курсор находится в "DoNotExist" ), и он не будет жаловаться.
Ответ 4
Может ли Eclipse разрешить атрибуты, созданные во время выполнения через __metaclass__
es?
Обратите внимание, что вы никогда не определяете DoesNotExist
на любой из ваших моделей, и она также не определена на django.db.models.base.Model
.
Ответ 5
Вы также можете решить его по-другому: просто перейдите в класс User и добавьте @DynamicAttrs в docstring.
Это скажет PyDev, что атрибуты класса добавляются динамически и не будут больше жаловаться на "проблемы" вроде DoNotExist.
Ответ 6
У меня такая же проблема на 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
Ответ 7
Eclipse жалуется, что User.DoesNotExist undefined.
Что вы подразумеваете под этим? У вас есть ошибка python и трассировка стека? Этот код должен работать (как в документации). Похож на проблему затмения. Просто запустите dev-сервер и посмотрите, работает ли он или нет:
manage.py runserver