[英]What is the best, cleanest and shortest way to check if a given value is valid URL when working with models?
我寧願盡可能多地使用 Django 的內置功能,並盡可能避免自己實現東西!
為什么以下代碼在給定非 URL 值時不發出異常?
模型.py :
from django.core.validators import URLValidator
from django.db import models
class Snapshot(models.Model):
url = models.URLField(validators=[URLValidator])
視圖.py :
from django.http import HttpResponse
from .models import Snapshot
def index(request):
a = Snapshot(url='gott ist tot')
a.save()
因為此驗證器在您使用 django 表單時運行。 有關文檔驗證器的更多信息: 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 內置函數的更好方法
您可以使用 URL 驗證器檢查 URL 是否是有效的 URL。
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']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.