Почему использование validators=[URLValidator] при определении поля модели CharField не заставляет его проверять URL-валидность при сохранении соответствующей ModelForm?

app.models.py:

from django.core.validators import URLValidator
from django.db import models

class Snapshot(models.Model):
    url = models.CharField(max_length=1999, validators=[URLValidator])

app.forms.py:

from django import forms
from .models import Snapshot

class SnapshotForm(forms.ModelForm):
    class Meta:
        model = Snapshot
        fields = ('url',)

app.views.py:

from django.http import HttpResponse
from .forms import SnapshotForm

def index(request):
    snapshot_form = SnapshotForm(data={'url': 'not an URL!'})

    if snapshot_form.is_valid():
        snapshot_form.save()

    return HttpResponse("")

Почему он сохраняет "не URL!" в БД, несмотря на то, что это не действительный URL?!

Какой правильный способ включения URLValidator?

Вы указали валидаторы для своего поля следующим образом: validators=[URLValidator]. Это неверно, поскольку аргумент validators принимает список вызываемых валидаторов , которые выполняют валидацию. В данном случае, хотя URLValidator является вызываемым, на самом деле это метод __init__ вызываемого класса. Вам нужно передать экземпляр класса, чтобы он работал правильно:

# Note the brackets after URLValidator to instantiate the class
url = models.CharField(max_length=1999, validators=[URLValidator()])

Лучше всего, поскольку вы хотите принимать URL, просто использовать класс URLField для вашего поля:

url = models.URLField(max_length=1999)
Вернуться на верх