Какой самый лучший, чистый и короткий способ проверить, является ли данное значение действительным URL при работе с моделями?
Я скорее хочу использовать встроенные функции Django настолько, насколько это возможно, и по возможности избегать самостоятельной реализации!
Почему следующий код не выдает исключения при передаче значения неURL?
models.py:
from django.core.validators import URLValidator
from django.db import models
class Snapshot(models.Model):
url = models.URLField(validators=[URLValidator])
<
from django.http import HttpResponse
from .models import Snapshot
def index(request):
a = Snapshot(url='gott ist tot')
a.save()
Потому что этот валидатор запускается, когда вы используете форму django. Больше информации о валидаторах на сайте doc : https://docs.djangoproject.com/en/4.1/ref/validators/
если вы делаете форму :
from django import forms
from .models import Snapshot
class SnshotForm(forms.ModelForm):
class Meta:
model = Snapshot
fields = ('url', )
и ваш views.py :
from django.http import HttpResponse
from .forms import SnapshotForm
def index(request):
a = SnapshotForm(data={'url': 'gott ist tot'})
if a .is_valid()
a.save()
else:
print(a.errors)
Ваш валидатор будет запущен, и вы увидите сообщение формы ошибки
Без использования формы вы можете вызвать ручной валидатор в представлении или в методе сохранения:
# in views
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError
def index(request):
url_validator = URLValidator()
url = 'gott ist tot'
is_valid_url = False
try:
url_validator(url)
except ValidationError:
pass
if is_valid_url:
a = Snapshot(url=url)
a.save()
else:
print(a.errors)
Будьте осторожны! Я не рекомендую обходить валидатор с помощью форм, я думаю, что это лучший способ для максимального использования функций django builtins
Вы можете проверить, является ли URL действительным, используя URL Validator.
from django.core.validators import URLValidator
from django.db import models
class Snapshot(models.Model):
url = models.URLField(validators=[URLValidator])
Кроме того, если вы хотите проверить, является ли URL доступным или нет, вы можете сделать что-то подобное в clean_url
или в view
вот так:
import urllib.request
def clean_url(self):
try:
urllib.request.urlopen(self.cleaned_data['url']).getcode()
except:
raise forms.ValidationError('Invalid URL')
return self.cleaned_data['url']