Какой самый лучший, чистый и короткий способ проверить, является ли данное значение действительным 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']
Вернуться на верх