簡體   English   中英

URL 在使用模型時檢查給定值是否有效的最好、最干凈和最短的方法是什么?

[英]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_urlview中執行類似操作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM