作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现类似于 Facebook 正在做的事情:在博客文章中,当您发布文章链接时,它会自动获取标签以获取图像、标题和描述,然后将其呈现在页。
在起草帖子时,由于 Django Channels,我使用 websocket
将链接从前端发送到后端,以通过 Beautiful Soup 检索不同的元素。然后我将它们发送回前面以显示它们。
当我想将帖子与共享 url 元素一起保存时,就会出现问题。为了管理帖子创建,我使用 CBV PostCreate
。我可以将共享 url 元素保存在消费者中。但这两个对象没有链接,我不知道如何获取 SharedArticle
对象 id 并将其与帖子一起保存。
我有两个模型: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)
知道如何实现这一目标吗?
最佳答案
发现 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/
我是一名优秀的程序员,十分优秀!