Создайте объект «post» и инициализируйте атрибут m2m с идентификатором сообщения и идентификатором автора

Я пытаюсь выполнить следующее в Django:

Приложение, которое позволяет пользователям создавать посты с изображениями. Они могут просматривать любые сообщения в системе и добавлять эти сообщения в свои закладки. Когда пользователь создает сообщение, оно автоматически добавляется в его закладки.

Модель

class Post(models.Model):
    id                  = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    post_image          = models.ImageField(max_length=255, upload_to='images/content/', blank=False, null=False)
    author              = models.ForeignKey(User, on_delete=models.PROTECT, related_name='authors')
    tags                = TaggableManager(through=UUIDTaggedItem, help_text=_('Maximum of 5 tags allowed'))
    created             = models.DateTimeField(auto_now_add=True)
    bookmarks           = models.ManyToManyField(User, related_name='bookmarked', blank=True)
    bookmark_count      = models.IntegerField(default=0)
    
    def get_create_date(self):
        return self.created.strftime("%B %Y")

    ordering = ['-created']

Вид

@login_required
def post_add_view(request, *args, **kwargs):
    context = {}
    user = request.user
    if request.method == 'POST':
        form = PostAddForm(request.POST, request.FILES)
        if form.is_valid():
            new_post = form.save(commit=False)
            new_post.author = user
            new_post.save()
            form.save_m2m()
            context['form'] = form
            messages.add_message(request, messages.SUCCESS, 'Image uploaded successfuly!')
            return redirect('library:posts')
        context['form'] = form
        return render(request, 'library/post_add.html', context)
    else:
        form = PostAddForm()
        context['form'] = form
    return render(request, 'library/post_add.html', context)

Когда пользователь создает новую публикацию, эта публикация будет связана с дополнительным атрибутом в объекте публикации, который называется «закладки». Атрибут «закладки» имеет отношения «многие ко многим» с автором и публикацией.

Я могу легко создать объект сообщения, связать его с автором и сохранить в БД. Эта часть работает нормально. Часть, с которой я борюсь, - это то, как обрабатывать поле «закладки». Идентификатор автора прост, так как он у меня уже есть из сеанса с user = request.user.

Каким-то образом мне нужно получить идентификатор вновь созданного сообщения, чтобы я мог прикрепить его к полю «закладки». Здесь я застрял. Я новичок в Django и программировании в целом.

Я видел несколько возможных способов справиться с этим, но я не уверен, что они правильные или целесообразные.

Сигналы Джанго

Я видел несколько сообщений в Интернете об использовании сигналов.

Джанго транзакции

В этом ТАК посте обсуждается использование транзакций

Нужно ли мне использовать один из вышеперечисленных методов или есть другой способ выполнить то, что я хочу? Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я вас правильно понял, все, что вам нужно сделать, это добавить пользователя в поле закладок в файле new_post. Тем не менее, я думаю, что new_post нуждается в идентификаторе, чтобы это было возможно, хотя кто-то может меня поправить. Я имею в виду, что пользователя нужно добавить в закладки после того, как new_post будет сохранен (именно тогда new_post присваивается идентификатор). Итак, что-то вроде:

....

if form.is_valid():
            new_post = form.save(commit=False)
            new_post.author = user
            new_post.save()
            new_post.bookmarks.add(user)
            form.save_m2m()
            ...

Другие вопросы по теме