5

送信された URL がデータベースにまだ存在しないことを検証しようとしています。

Form クラスの関連部分は次のようになります。

from django.contrib.sites.models import Site
class SignUpForm(forms.Form):
    # ... Other fields ...
    url = forms.URLField(label='URL for new site, eg: example.com')

    def clean_url(self):
        url = self.cleaned_data['url']
        try:
            a = Site.objects.get(domain=url)

        except Site.DoesNotExist:
            return url

        else:
            raise forms.ValidationError("That URL is already in the database.  Please submit a unique URL.")

    def clean(self):
        # Other form cleaning stuff.  I don't *think* this is causing the grief

問題は、送信した値に関係なく、 を上げられないことValidationErrorです。そして、メソッドで次のようなことをするとclean_url():

if Site.objects.get(domain=url):
    raise forms.ValidationError("That URL is already in the database.  Please submit a unique URL.")

その後DoesNotExist、データベースに既に存在する URL に対してもエラーが発生します。何か案は?

4

4 に答える 4

4

IRC の django チャンネルが私を救ってくれました。問題は、URLField.clean() が予期していなかった 2 つのことを行うことでした。

  1. URL スキームが存在しない場合 (http:// など)、メソッドは URL の先頭に「http://」を追加します。
  2. このメソッドは、末尾のスラッシュも追加します。

結果が返され、フォームのcleaned_dataに保存されます。だから私はcleaned_data['url']のようなものを期待してexample.com実際に得ていることを確認していhttp://example.com/ました。私のclean_url()方法を次のように変更すると、次のようになります。

def clean_url(self):
        url = self.cleaned_data['url']        
        bits = urlparse(url)
        dom = bits[1]
        try:
            site=Site.objects.get(domain__iexact=dom)
        except Site.DoesNotExist:
            return dom
        raise forms.ValidationError(u'That domain is already taken.  Please choose another')
于 2008-12-04T18:30:40.107 に答える
1

私はこのようにします。少し簡単です。

try:
    a = Site.objects.get(domain=url)
    raise forms.ValidationError("That URL is already in the database.  Please submit a unique URL.")
except Site.DoesNotExist:
    pass
return url
于 2008-12-04T02:38:01.963 に答える
0

同様の問題でGoogle経由でこれを見つけたのでログインしたので、Carl Meyersの投稿にコメントを追加したかったので、self._errorsの使用はDjangoドキュメントに従って完全に有効であることに注意してください

http://docs.djangoproject.com/en/1.2/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

于 2010-11-15T15:20:10.850 に答える
0

'' を返して _errors を埋めることができると思います。

msg = u"That URL is already in the database.  Please submit a unique URL."
self._errors["url"]=ErrorList([msg])
return ''

また

from django.contrib.sites.models import Site
class SignUpForm(forms.Form):
    # ... Other fields ...

url = forms.URLField(label='URL for new site, eg: example.com')

def clean_url(self):
    url = self.cleaned_data['url']
    try:
        a = Site.objects.get(domain=url)
        raise forms.ValidationError("That URL is already in the database.  Please submit a unique URL.")
    except Site.DoesNotExist:
        return url
    return ''

def clean(self):
    # Other form cleaning stuff.  I don't *think* this is causing the grief
于 2008-12-04T10:31:07.063 に答える