Почему использование 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)