Как передать данные модели в шаблон с помощью представления на основе функций?

У меня есть простая модель для группы:

class Group(models.Model):
   leader = models.ForeignKey(User, on_delete=models.CASCADE)
   name = models.CharField(max_length=55)
   description = models.TextField()
   joined = models.ManyToManyField(User, blank=True)
       email_list = ArrayField(
        models.CharField(max_length=255, blank=True),
        blank=True,
        default=list,
    )

Для этого есть четыре представления: DetailView, UpdateView, DeleteView и send_notifications. Первые два основаны на классах, а последний - на функциях. Вот здесь у меня и возникает проблема.

Когда я перехожу от моего base.html к любому из моих представлений, основанных на классах:

path('group/<int:pk>/', GroupDetail.as_view(), name='group_detail'),
path('group/<int:pk>/edit/', UpdateGroup.as_view(), name='update_group'),
path('group/<int:pk>/delete/', DeleteGroup.as_view(), name='delete_group'),

Я могу передать данные конкретной модели, используя ее первичный ключ:

<a href="{% url 'group_detail' group.pk %}">DETAILS</a>
<a href="{% url 'update_group' group.pk %}">EDIT</a>
<a href="{% url 'delete_group' group.pk %}">DELETE</a>

Итак, когда я нахожусь в одном из этих трех представлений, я могу отобразить такие вещи, как {{group.name}} или {{group.description}}, но когда я перехожу к представлению, основанному на функциях:

def notifications(request, pk):
    group = Group.objects.get(id=pk)
    if request.method == 'POST':
        subject = request.POST['subject']
        message = request.POST['message']
        recipients = group.email_list
        for recipient in recipients:
            send_mail (
                subject,
                message,
                NOTIFICATION_EMAIL,
                [recipient],
                fail_silently=False
            )
        return render(request, 'send_notifications.html', {'subject': subject, 'message': message})
    else:
        return render(request, 'send_notifications.html', {})

через его url:

path('group/<int:pk>/notifications/', notifications, name='send_notifications'),

и ссылка:

<a href="{% url 'send_notifications' group.pk %}">SEND NOTIFICATIONS</a>

Я не могу отобразить ни одного из данных группы. Есть ли что-то в представлении, основанном на функции, по сравнению с представлением, основанным на классе, что вызывает это? Все остальные части представления работают нормально, я просто не могу получить доступ к данным конкретной группы, как в представлениях на основе классов.

Единственная причина, по которой я использую представление на основе функций для отправки уведомлений, заключается в том, что я использую send_mail и встроенную модель электронной почты django. Должен ли я создать представление на основе класса для отправки уведомлений? Или есть способ передать данные в шаблон, используя мое представление на основе функций notifications?

Ключевым понятием здесь является контекст. Контекст обрабатывается за вас в представлениях на основе классов (хотя он расширяем), но в представлениях на основе функций вам нужно передать его шаблону явно. На самом деле вы уже делаете это в...

 return render(request, 'send_notifications.html', {'subject': subject, 'message': message})

Здесь вы передаете 'subject' и 'message' в качестве контекста. Передача группы так же проста, как добавление ключа и значения к объекту контекста.

 return render(request, 'send_notifications.html', {'subject': subject, 'message': message, 'group': group})

или

 return render(request, 'send_notifications.html', {'group': group})

в версии unPOST.

Вернуться на верх