NOT NULL 约束失败:dashboard_profile.user_id

NOT NULL constraint failed: dashboard_profile.user_id

我试图将用户的最后一个 IP 保存到 Django 中的配置文件模块,但我总是 NOT NULL constraint failed 我知道 last_ip 应该设置为 null=True 并且我运行 此命令:py .\manage.py makemigrationspy .\manage.py migrate。如果您有任何关于将 IP 保存给用户的建议对我有帮助。

提前致谢。

#models.py 

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True, max_length=150)
    last_ip = models.GenericIPAddressField(null=True, blank=True)
    avatar = ContentTypeRestrictedFileField(max_upload_size=10485760, null=True, verbose_name="",default='default.jpg', blank= True, content_types=['image/png', 'image/jpeg'])
    
    def __str__(self):
        return self.user.username
#forms.py 

class UpdateUserForm(forms.ModelForm):
    username = forms.CharField(max_length=150, required=True)
    first_name = forms.CharField(max_length=150, required=False)
    last_name = forms.CharField(max_length=150, required=False)
    email = forms.EmailField(required=True)
    
    class Meta:
        model = User
        fields = ['username','first_name','last_name','email']

class UpdateAvatarBio(forms.ModelForm):
    avatar = forms.ImageField()
    bio = forms.CharField()
    class Meta:
        model = Profile
        fields = ['avatar', 'last_ip', 'bio']
#views.py
def ip_client(request):
    return (
        x_forwarded_for.split(',')[0]
        if (x_forwarded_for := request.META.get('HTTP_X_FORWARDED_FOR'))
        else request.META.get('REMOTE_ADDR')
    )
def profile(request):
    ip = ip_client(request)
    model = Profile(last_ip=ip)
    model.save() # Traceback suppose here is the issue
    if request.method == 'POST':
    ...
    ...
    return render(request, 'profile.html', {'user_form': user_form, 'profile_form': profile_form})

您在保存前没有将用户添加到个人资料

def profile(request):
    ip = ip_client(request)
    model = Profile(last_ip=ip)
    moddl.user=request.user      #Add this
    model.save() # Traceback suppose here is the issue
    if request.method == 'POST':
         ...
         ...
   return render(request, 'profile.html', {'user_form': user_form, 'profile_form': profile_form})

编辑: 由于用户是OneToOne(这意味着它是一个主键),所以你的代码应该是这样的

def profile(request):
    ip = ip_client(request)
    profile = Profile.objects.get(user=request.user)
    profile.last_ip = ip
    profile.save()
    if request.method == 'POST':
         ...
         ...
   return render(request, 'profile.html', {'user_form': user_form, 'profile_form': profile_form})