Search code examples
djangopython-3.xpreview

Extract meta content doesn't work


I want to build a system like the preview in telegram for my website :

Telegram article preview

This is what I've done :

class Card(models.Model):
    link = models.URLField('lien vers le post')

    def extract_meta(self):
        target = urlopen(self.link).read()
        tree = etree.HTML(target)
        metas = tree.xpath('//meta')

        self.title = None
        self.description = None
        self.image = None
        self.site_name = None

        for meta in metas:
            meta = etree.tostring(meta).decode('utf-8')
            if 'og:title' in meta:
                self.title = re.findall(r"content=\"(.*)\"", meta)[0]

            if 'og:description' in meta:
                self.description = re.findall(r"content=\"(.*)\"", meta)[0]

    def save(self, *args, **kwargs):
        self.extract_meta()
        super(Card, self).save(*args, **kwargs)

But an instance of the Card class doesn't have any self.title, self.description... Why??


Solution

  • This is because you haven't actually defined title and description fields in your model:

    class Card(models.Model):
        link = models.URLField('lien vers le post')
    
        # add these two lines below
        title = models.CharField(max_length=200)
        description = models.TextField(blank=True)
    

    When you've added the fields, you'll be able to access self.title and self.description.