Я пытаюсь добиться чего-то похожего на то, что делает Facebook: в сообщении в блоге, когда вы публикуете ссылку на статью, он автоматически выбирает тег, чтобы получить изображение, заголовок и описание, а затем отображает его наpage.
При составлении поста я использую websocket
благодаря Django Channels, чтобы отправить ссылку с лицевой стороны на бэкэнд для извлечения различных элементов через Beautiful Soup.А затем я отправляю их обратно на фронт, чтобы отобразить их.
Проблема возникает, когда я хочу сохранить сообщение вместе с общими элементами URL.Для управления созданием поста я использую CBV PostCreate
.Я могу сохранить общие URL-адреса в потребителе.Но два объекта не связаны, и я не знаю, как получить идентификатор объекта SharedArticle
и сохранить его вместе с сообщением.
У меня есть две модели: Post
и SharedArticle
.
Вот мой consumer.py
class UrlConsumer(AsyncConsumer):
async def websocket_connect(self, event):
chat_room = "shared_url"
self.chat_room = chat_room
await self.channel_layer.group_add(
chat_room,
self.channel_name
)
await self.send({
"type": "websocket.accept"
})
async def websocket_receive(self, event):
print("receive", event)
page = urlopen(event['text'])
soup = BeautifulSoup(page, "html.parser")
title = soup.find('meta', property='og:title')
img = soup.find('meta', property='og:image')
description = soup.find('meta', property='og:description')
article = {
'title':title['content'],
'img':img['content'],
'description': description['content'],
'url': event['text']
}
await self.channel_layer.group_send(
self.chat_room,
{
"type": "chat_message",
"text": json.dumps(article)
}
)
await self.create_shared_article(
article['title'],
article['description'],
article['img'],
article['url'])
Вот мой views.py
class PostCreate(UserPassesTestMixin, CreateView):
model = Post
fields = ['title', 'content', 'draft', 'publish', 'category']
def test_func(self):
return self.request.user.is_superuser
def form_valid(self, form):
form.instance.user = self.request.user
content = form.instance.content
title = form.instance.title
send_email(title, content)
return super().form_valid(form)
def get_form(self):
form = super().get_form()
form.fields['content'].widget = PagedownWidget(show_preview=False)
form.fields['publish'].widget = SelectDateWidget()
return form
И мой models.py
class ArticleShared(models.Model):
title = models.CharField(max_length=250)
description = models.CharField(max_length=500)
url = models.CharField(max_length=250)
img = models.CharField(max_length=250)
def __str__(self):
return self.title
class Post(models.Model):
user = models.ForeignKey(User,
null=True,
default=1,
on_delete=models.SET_NULL
)
title = models.CharField(max_length=250)
content = models.TextField()
draft = models.BooleanField(default=False)
publish = models.DateTimeField(auto_now=False,
auto_now_add=False,
default=now())
created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True, auto_now_add=False)
category = models.ForeignKey(Category,
null=True,
on_delete=models.SET_NULL)
article_shared = models.ForeignKey(ArticleShared,
null=True,
on_delete=models.SET_NULL)
Любая идеяо том, как этого добиться?