Как связать два объекта, сохраненные в разных местах в Джанго - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь добиться чего-то похожего на то, что делает 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)

Любая идеяо том, как этого добиться?

1 Ответ

0 голосов
/ 01 декабря 2018

Вам нужно передать первичный ключ ArticleShared обратно через канал после того, как вы его обнаружите.Для этого вам нужно изменить порядок ваших 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 перед сохранениемПочта.

...