У меня есть модель с полем URL в моем проекте платформы отдыха Django. Я хочу гарантировать, что к URL-адресу будет добавлена схема (например, https://), если она не существует.
from django.db import models
class MyModel(models.Model):
url = models.URLField()
Я пробовал использовать методы clean
, save
, clean_fields
, но ни один из них не работает.
Я чувствую, что должен быть простой способ добиться этого, но я не могу его найти.
Например, я хочу отправить «google.com» в свой POST-запрос и добавить https://
перед проверкой через URLField. Если я изменю значение поля в методах save
или clean
, мне все равно выдаст ошибку проверки: «Введите действительный URL-адрес».
Мы будем очень признательны за любые предложения или лучшие практики.
Спасибо!
@willeM_VanOnsem, я не жду, что они добавят https. Я ожидал, что смогу изменить необработанные данные, и добавил https к отправленному URL-адресу. но перед запуском любого моего кода выдается ошибка проверки.
Какую ошибку вы получили от сервера?
@Tanveer Я отредактировал исходный вопрос
выполнение этого в javascript может быть одним из решений
@folengateis Думаю, мне придется отказаться от URLField или изменить вводимые данные с помощью JavaScript.
Для этой проблемы я настоятельно рекомендую создать собственную функцию сохранения для вашей модели, чтобы проверить, нет ли https://
, или http://
создать ее для нее.
from django.db import models
class MyModel(models.Model):
url = models.URLField()
def save(self, *args, **kwargs):
if not self.url.startswith("http://")):
self.url = "http://" + self.url
super().save(*args, **kwargs)
Это не работает. Перед запуском save() выдается ошибка проверки.
ты используешь дрф?
Я нашел решение своего вопроса, который переопределяет метод to_internal_value
URLField
в сериализаторе. Я понял, что мне следует изменить данные в сериализаторе вместо модели.
class CustomURLField(serializers.URLField):
def to_internal_value(self, value):
value = super().to_internal_value(value)
if value and not (value.startswith('http://') or
value.startswith('https://')):
value = 'https://' + value
return value
class MyModelSerializer(serializers.ModelSerializer):
url = CustomURLField()
class Meta:
model = MyModel
fields = '__all__'
Если бы я не использовал Django REST Framework, думаю, мне пришлось бы вместо этого переопределить метод to_python в поле модели.
Я действительно не понимаю, почему вы ожидаете, что
clean
/save
/... будет добавлятьhttps
, это также может бытьftp
,tel
,mailto
,magnet
и т. д.