Как передать данные модели в шаблон с помощью представления на основе функций?
У меня есть простая модель для группы:
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.