【问题标题】:How can I save a django form如何保存 django 表单
【发布时间】:2022-01-19 19:59:15
【问题描述】:

所以我想为每个新创建的用户保存一个传记。用户可以输入他的个人简历,并将其添加到他的个人资料中。

为此,我使用 OneToOneField 创建了一个模型

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver


class Profile(models.Model):
    user = models.OneToOneField(
        User, on_delete=models.CASCADE, null=True, blank=True)
    bio = models.CharField(max_length=30)

为了创建表单,我在 forms.py 中执行了以下操作:

class BioForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('bio',)

然后我在views.py中创建了保存,所以bio会被保存到特定的用户:


from .forms import LoginForm, RegisterForm
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout, get_user_model
from django.contrib.auth import get_user_model


def test_view(request):
    form = BioForm(request.POST)
    user = get_user_model
    if form.is_valid():
        profile = form.save(commit=False)
        profile.user = request.user
        profile.phone_number = request.phone_number
        profile.save()

    return render(request, 'test.html', {'form': form})

views.py 中有一些大问题,但我不明白。 我可以提交表单并且表单将被保存(有时)但没有编写它的用户 + 我收到此错误:

ValueError at /test/

Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x00000253B7140D00>>": "Profile.user" must be a "User" instance

【问题讨论】:

  • user = get_user_model 更改为user = request.useruser = get_user_model()
  • 什么都不做
  • print(request.user) 显示什么?出现错误时用户是否已登录?

标签: python django windows django-models


【解决方案1】:

尝试分配用户 ID

from .forms import LoginForm, RegisterForm
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout, get_user_model
from django.contrib.auth import get_user_model

def test_view(request):
    form = BioForm(request.POST)
    user = get_user_model
    if form.is_valid():
        profile = form.save(commit=False)
        profile.user_id = request.user.id
        profile.phone_number = request.phone_number
        profile.save()

    return render(request, 'test.html', {'form': form})

【讨论】:

  • 用户的惰性对象只有在你尝试访问其中的属性时才会触发。
  • 另外,您应该使用request.user.is_authenticated()验证用户是否已登录,否则您可能会收到另一个错误,因为无法将匿名用户分配到O2O字段
【解决方案2】:

您的问题是您尝试保存的用户不是数据库中存在的经过身份验证的用户。只有经过身份验证(登录)的用户存在于数据库中,并且可以在关系字段中使用

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 2014-05-19
    • 2017-04-18
    • 2010-11-26
    • 2020-07-02
    • 2017-04-04
    • 1970-01-01
    • 2020-07-31
    相关资源
    最近更新 更多