首页 > 解决方案 > Django 如何在 Django 表单中自动保存用户?

问题描述

当我将“用户”字段传递给我的模型表单时。我将所有用户详细信息作为下拉列表。看图片:

在此处输入图像描述

我正在尝试保存当前用户实例而不显示此下拉列表,因为我希望用户将自动保存而不选择或显示此下拉列表。

这是我的forms.py文件:

class ProfileFroms(forms.ModelForm):
      
      class Meta:
          model = UserProfile
          fields = ["user","profile_pic","mobile","country","website_link"] 

当我从字段中删除“用户”时,出现此错误:

"NOT NULL constraint failed: members_userprofile.user_id"

我还尝试了此代码来保存当前用户,但它让我遇到了同样的错误。

视图.py

if forms.is_valid():
          forms.user = request.user

这是我的完整代码:

模型.py

class UserManagement(AbstractUser):
      is_subscriber = models.BooleanField(default=False)
      is_customer = models.BooleanField(default=False)


class UserProfile(models.Model):
      user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name="userprofile")
      profile_pic = models.ImageField(upload_to='profile/images/',validators=[validate_file_size,FileExtensionValidator( ['png','jpg'] )],blank=True,null=True)
      mobile = models.IntegerField(blank=True,null=True)
      country = models.CharField(max_length=200,blank=True,null=True)
      website_link = models.CharField(max_length=3000,blank=True,null=True)

视图.py

def UserProfileView(request):

   userinfo = UserManagement.objects.filter(username=request.user)
    
   
   forms = ProfileFroms(request.POST,request.FILES or None)
   if request.method == "POST":
      if forms.is_valid():
          #forms.user = request.user #tried this line for save current user but didn't work 
          forms.save()
          messages.add_message(request, messages.INFO,'Profile updated sucessfully') 
          return redirect("members:user-profile-private")
   else:
      messages.add_message(request, messages.INFO,'Somethings wrong. Profile not updated')  
      print("invalid")

   context={"userinfo":userinfo,"forms":forms}

   return render(request,"members/privateprofile.html",context)

标签: djangodjango-forms

解决方案


从表单中删除user字段:

class ProfileFroms(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ['profile_pic', 'mobile', 'country', 'website_link']

然后你改变.instance表单的(不是表单本身),所以:

if forms.is_valid():
    forms.instance.user = request.user
    forms.save()

推荐阅读