gpt4 book ai didi

python - 如何链接Django中保存在不同位置的两个对象

转载 作者:行者123 更新时间:2023-12-01 08:39:40 25 4
gpt4 key购买 nike

我正在尝试实现类似于 Facebook 正在做的事情:在博客文章中,当您发布文章链接时,它会自动获取标签以获取图像、标题和描述,然后将其呈现在页。

在起草帖子时,由于 Django Channels,我使用 websocket 将链接从前端发送到后端,以通过 Beautiful Soup 检索不同的元素。然后我将它们发送回前面以显示它们。

当我想将帖子与共享 url 元素一起保存时,就会出现问题。为了管理帖子创建,我使用 CBV PostCreate。我可以将共享 url 元素保存在消费者中。但这两个对象没有链接,我不知道如何获取 SharedArticle 对象 id 并将其与帖子一起保存。

我有两个模型:PostSharedArticle

这是我的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)

知道如何实现这一目标吗?

最佳答案

发现 ArticleShared 后,您需要通过 channel 将其主键传回。为此,您需要更改 create_shared_article 和 group_send 的顺序。

async def websocket_receive(self, event):
# .. look up data
article_shared = self.create_shared_article(...)
await self.channel_layer.group_send(
self.chat_room,
{
"type": "chat_message",
"text": json.dumps(
{ "article" : article, "pk" : article_shared.pk }
)
}
)

然后,在您的前端代码中,您可以在保存帖子之前将“pk”插入到article_shared 的表单字段中。

关于python - 如何链接Django中保存在不同位置的两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com