I want to build a system like the preview in telegram for my website :
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??
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
.