web-dev-qa-db-ja.com

TextFieldよりもURLFieldを使用する利点は?

TextFieldTextFieldの速度の違いはPostgreSQLでは無視できるため、PostgreSQLデータベースを使用する場合は、可変長文字列に常にCharFieldを使用する必要があります。 。私はDjangoが比較的新しく、私のデータベースで可変長URLにTextFieldを使用することを検討していました。 URLFieldを使用する利点があるかどうか疑問に思っていましたか? URLにTextFieldではなくURLFieldを使用するのは不適切な形式と見なされますか?

40
HighLife

URLFieldは実際にはCharField w/RegexpベースのURLパターンチェックとオンラインバリデーター(RegExベースのバリデーターに置き換えられました)のサポートです。URLの長さ制限を気にしない場合はTextFieldを使用できます

from Django.core.validators import URLValidator

# in model
field = models.TextField(validators=[URLValidator()])

さらに、CharFieldまたはTextFieldの使用は、フィールドの最大長の制約が必要かどうか、および編集に適したエレメントタイプ(textareaまたはinput)によって異なります。 PostgreSQL側では、大きな違いはありません。

61
okm

https://docs.djangoproject.com/en/dev/ref/models/fields/#urlfield もちろん、CharField/TextFieldを使用できますが、ユーザー入力を処理し、入力したユーザーが確実に起動するようにします-あなたへ。

ソースコードから:

#CharFieldと同様に、これによりURL検証が実行されます

RLFieldソースコード が表示される場合、実際にはURLバリデーターを備えたCharFieldであることがわかります。

また、EmailField、ImageField、* Field!など、すぐに使用できるフィールドもあります!

3
Alireza Savand

このクラスを試してください:

class LongURLField(TextField):
    description = 'Long URL'

    def __init__(self, verbose_name=None, name=None, **kwargs):
        TextField.__init__(self, verbose_name, name, **kwargs)
        self.validators.append(validators.URLValidator())

    def formfield(self, **kwargs):
        # As with TextField, this will cause URL validation to be performed
        # twice.
        defaults = {
            'form_class': forms.URLField,
        }
        defaults.update(kwargs)
        return super(LongURLField, self).formfield(**defaults)
2
Vladislav