首页 > 解决方案 > Clean_field 函数无法与 updateview 一起正常工作。我们如何纠正这种行为?

问题描述

好吧,我正在使用信号创建用户配置文件,每当新用户注册时,它的配置文件都会自动创建,现在我想根据用户注册表单字段填写配置文件字段。然后从用户端,当用户登录后进入其个人资料时,他将看到填写了他/她在注册时提供的信息的表格。如果他想改变他的一些信息,那么他可以改变它。现在的问题是我们必须根据用户在配置文件表单中提供的信息同时更新用户模型和用户配置文件模型。现在在我的代码中,条件和检查在 forms.py 中无法正常工作。

视图.py

class UserProfile(models.Model):

    user = models.OneToOneField(auth.models.User,related_name='userprofile', on_delete=models.CASCADE)
    avatar = models.ImageField(("displays"), upload_to='displays', height_field=None, width_field=None, max_length=None,default ='user.jpg')
    create_date = models.DateTimeField(default = timezone.now)
    Gender = (
    ('one','Male'),
    ('two','Female'),
    )
    first_name = models.CharField(("first_name"), max_length=50,null=True)
    last_name = models.CharField(("last_name"), max_length=50,null=True)
    username = models.CharField(("username"), max_length=50,null=True)
    age = models.IntegerField(("age"),null=True)
    gender = models.CharField(("gender"), max_length=50,choices=Gender,null=True)


    def save(self,*args, **kwargs):
        if not self.username:
            self.username  = self.user.username
        if not self.age:
            self.age = self.user.age
        if not self.gender:
            self.gender  = self.user.gender
        if not self.first_name:
            self.first_name  = self.user.first_name
        if not self.last_name:
            self.last_name  = self.user.last_name
        super(UserProfile,self).save(*args, **kwargs) 

Forms.py 清理函数不会引发错误。

class UserProfileForm(forms.ModelForm):
    
    class Meta:
        model = UserProfile
        fields = ("avatar","username","first_name","last_name","age","gender")
        Gender = (
            ('one','Male'),
            ('two','Female'),
            )
            
        widgets ={
            'gender' : forms.Select(choices=Gender,attrs={'class': 'form-control'}),
        }
        
     def clean_age(self):
         age = self.cleaned_data["age"]
         print(age,'hm here')
         if age < 18:
             raise forms.ValidationError("You're age should be 18 plus")
         return age
    
     def clean_username(self):
         username = self.cleaned_data['username']
         if User.objects.filter(username=username).exists():
             raise forms.ValidationError("username already exists")
         return username

视图.py

class UserProfileUpdateView(UpdateView):
    refirect_field_name ='accounts:profile'
    template_name = 'accounts/profiles/profile_update.html'
    form_class = UserProfileForm
    model = UserProfile

    def get_object(self, *args, **kwargs):
        return self.request.user.userprofile
    
    def get_context_data(self, *args, **kwargs):
        context = super(UserProfileUpdateView, self).get_context_data(*args, **kwargs)
        update_form = UserProfileForm(instance = self.request.user.userprofile)
        context['form']=update_form
        return context
    
    def form_valid(self, form):
            username = form.cleaned_data['username']
            print('username :',username)
            first_name = form.cleaned_data['first_name']
            print('first name :',first_name)
            last_name = form.cleaned_data['last_name']
            print('last name :',last_name)
            age = form.cleaned_data['age']
            print('age :',age)
            gender = form.cleaned_data['gender']
            print('gender :',gender)
            # usermodel save
            user = User.objects.get(username=self.request.user)
            print('GOT reqested User',user)
            user.username = username
            print('changed username :',user.username)
            user.age = age
            print('changed age :',user.age)
            user.gender = gender
            print('changed gender:',user.gender)
            user.first_name = first_name
            print('changed first name :',user.first_name)
            user.last_name = last_name
            print('changed last name :',user.last_name)
            user.save()
            # userprofile save
            profile = UserProfile.objects.get(user=self.request.user)
            print('GOT reqested User',profile)
            profile.username = username
            print('changed username :',profile.username)
            profile.age = age
            print('changed age :',profile.age)
            profile.gender = gender
            print('changed gender:',profile.gender)
            profile.first_name = first_name
            print('changed first name :',profile.first_name)
            profile.last_name = last_name
            print('changed last name :',profile.last_name)
            profile.save()
            form.save()
            return super().form_valid(form)

标签: pythondjangodjango-modelsdjango-viewsdjango-forms

解决方案


推荐阅读