python - 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)
解决方案
推荐阅读
- sql - 报告内存数据存储?
- java - TextView 没有出现。空白卡片视图
- php - 为什么 fetch POST 返回待处理的 API 调用在 React
- javascript - Javascript 连接错误或 Node.js MSSQL 模块添加了额外的引号?
- ios - 使用 UIPresentationController 时如何允许父视图的手势仍然有效/不被禁用?(复制 Apple 地图功能)
- c++ - 无法使用柯南将 SDL2 设置为在 linux ubuntu 20.04 上使用音频(alsa)运行
- javascript - 是否可以从 TamperMonkey 脚本中读取浏览器的控制台?
- reactjs - 使用 React 限制地图上的点击次数
- html - 导航栏品牌文字只能点击一次,锁定后无法再次点击
- java - 方法不计算演示类中的输出