如何在 Django 中设置与 Session 相关的字段

问题描述 投票:0回答:2

我想在我当前的项目中实现Web推送通知,并且我希望通知仅发送到当前登录的会话(即设备)。

因此我定义了我的

Subscription
模型,如下所示:

class Subscription(models.Model):
    device = models.CharField(max_length=100)
    session = models.OneToOneField('sessions.Session', on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    info = models.JSONField()

以及保存订阅的查看功能:

SubscriptionForm = model form_factory(Subscription, fields=['device', 'info'])

@login_required
@require_POST
def subscr_view(request):
    form = SubscriptionForm(request.POST)
    if form.is_valid():
        form.instance.session = request.session.model
        form.instance.user = request.user
        subscr = form.save()
        return JsonResponse({'subscription': subscr.id}, status=201)
    return JsonResponse({'errors': list(form.errors.keys())})

但是,当我保存表单时,Django 抱怨会话属性:

ValueError: Cannot assign "<class 'django.contrib.sessions.models.Session'>": "Subscription.session" must be a "Session" instance.

如何正确设置会话属性?

django django-sessions
2个回答
0
投票

您必须分配

Session
的实例,而不是
Session
类,因此更改此行:

form.instance.session = request.session.model

form.instance.session = request.session

0
投票

为了使工作代码清晰,这里是:

from django.contrib.sessions.models import Session
from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_POST

@login_required
@require_POST
def subscr_view(request):
    form = SubscriptionForm(request.POST)
    if form.is_valid():
        session_key = request.session.session_key
        session = get_object_or_404(Session, session_key=session_key)

        form.instance.session = session
        form.instance.user = request.user
        subscr = form.save()
        return JsonResponse({'subscription': subscr.id}, status=201)
    return JsonResponse({'errors': list(form.errors.keys())})
© www.soinside.com 2019 - 2024. All rights reserved.