首页 > 解决方案 > 在 django 管理面板中尝试除外

问题描述

我的 models.py 中有一个函数,它使用 OpenGraph 通过 URL 添加我传递给它的新闻。这个过程工作正常,但是有一些网站给我一个错误,我怎么能用try来控制这个错误并且应用程序不会崩溃?

发生错误时,我希望管理面板中的应用程序将我返回到以前的相同位置,但指示错误。

最好的问候,非常感谢你!

我的模型.py:

class Post(models.Model):
title = models.CharField(max_length=200, verbose_name="Título", null=True, blank=True)
content = RichTextField(verbose_name="Contenido", null=True, blank=True)
published = models.DateTimeField(verbose_name="Fecha de publicación", default=now, null=True, blank=True)
image = models.ImageField(verbose_name="Imagen", upload_to="blog", null=True, blank=True)
author = models.ForeignKey(UserManegement, verbose_name="Autor", on_delete=models.CASCADE)
categories = models.ManyToManyField(Category, verbose_name="Categorias", related_name="get_posts")
url_web = models.URLField(verbose_name="URL", null=True, blank=True)
created = models.DateTimeField(auto_now_add=True, verbose_name='Fecha de creacion')
updated = models.DateTimeField(auto_now=True, verbose_name='Fecha de ediccion')

class Meta:
    verbose_name = "entrada"
    verbose_name_plural = "entradas"
    ordering = ['-created']

def __str__(self):
    return self.title

我要在其中插入 try except 的函数。它在同一个models.py中:

@receiver(pre_save, sender=Post)
def url_processor(sender, instance, *args, **kwargs):

    if instance.url_web:

        title, description, image = web_preview(instance.url_web)

        instance.title = title
        instance.content = description
    
        path = 'blog/' + uuid.uuid4().hex + '.png'
        instance.image = path
        img_data = requests.get(image).content
        with open('media/' + path, 'wb') as handler:
            handler.write(img_data)
    else:
        return

这是输入此 url 时的错误:Web error

requests.exceptions.MissingSchema: Invalid URL 'None': No schema supplied. Perhaps you meant http://None?

我所看到的错误是由于 URL 的 21,版本 3.6.10 中的 Python 请求库将其视为错误。它只发生在其域中有一些数字的 URL 上。

标签: pythondjangodjango-models

解决方案


而不是signals在模型clean方法中使用此代码。

从 django.core.exceptions 导入 ValidationError

Class YourModel(models.Model):
    # fields

    def clean(self, *args, **kwargs):
        try:
            # your signal code here
        except:
            raise ValidationError('Your message')

推荐阅读