web-dev-qa-db-ja.com

Django-User.DoesNotExistは存在しませんか?

Djangoを手に入れようとしています。私はEclipseでPydevを使用しています。仕事に行けない簡単なサインアップページを書きました。 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)
    ...
32
shanyu

問題は実際にはPyDevにあり、コードではありません。あなたがしたことは絶対に正しいですが、IDEはPythonのような動的言語で属性を解決するのが常に困難です。 DoesNotExist例外の場合、通常のオブジェクト継承ではなく__metaclass__を介して追加されるため、PyDevがそれを見つけることができない可能性があります。ただし、間違いなく機能するはずです。

23
Daniel Roseman

Pydevが実際にこれに対して素晴らしい回避策を持っていることを発見しました。

Window> Preferencesに移動し、次にPydev> Editor> Code Analysisに移動します。

ndefinedタブをクリックし、「DoesNotExist」を「次の名前をグローバルと見なします」というタイトルのテキストボックスに追加します。

20
SmileyChris

Pydevには、このような場合の回避策があります(メンバーが実行時に定義されている場合)。警告(またはカーソルが「DoesNotExist」にある場合はキーボードのctrl + 1)を引き起こす文字列の最後に#@ UndefinedVariableを追加するだけで、文句は表示されません。

7
mderk

Eclipseは__metaclass__esを介してランタイムで作成された属性を解決できますか?

どのモデルでもDoesNotExistを定義することはなく、Django.db.models.base.Modelでも定義されていないことに注意してください。

2
muhuk

このスニペットを使用した問題を解決するために、VirtualEnvのUbuntuで同じ問題が発生しています。

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
Domenico Monaco

別の方法で解決することもできます。Userクラスに移動し、docstringに@DynamicAttrsを追加するだけです。
これにより、クラスの属性が動的に追加されることがPyDevに通知され、DoesNotExistのような「問題」について文句を言わなくなります。

1
rob

Eclipseは、User.DoesNotExistが未定義であると文句を言います。

それはどういう意味ですか? pythonエラーとスタックトレースがありますか?このコードは機能する必要があります( documentation のように)。Eclipseの問題のようです。開発サーバーを実行して、それが発生するかどうかを確認してください。動作するかどうか:

manage.py runserver
0
alex vasi