【发布时间】:2015-01-15 04:15:03
【问题描述】:
尝试更新 User 模型和 UserProfile 模型我决定生成一个具有 User 和 UserProfile 模型属性的表单,以使用相同的表单更新两者。但是当我将表单提交到视图时,用户模型正在更新,没有 unicode 渲染,例如:(u'username' ), (你的名字)。我不明白为什么会这样,我检查了两个文件中的 utf-8 标签。
forms.py
# -*- encoding: utf-8 -*-
from django import forms
from django.contrib.auth.models import User
class UserProfileForm(forms.Form):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(UserProfileForm, self).__init__(*args, **kwargs)
username = forms.CharField(required=True,
widget = forms.TextInput(attrs={'class':'input', 'autocomplete':'off'}))
name = forms.CharField(required=True,
widget = forms.TextInput(attrs={'class':'input', 'autocomplete':'off'}))
lastname = forms.CharField(required=True,
widget = forms.TextInput(attrs={'class':'input', 'autocomplete':'off'}))
email = forms.CharField(required=True,
widget = forms.EmailInput(attrs={'class':'input', 'autocomplete':'off'}))
change_password = forms.BooleanField(required=False,widget = forms.CheckboxInput())
password1 = forms.CharField(required=False, min_length = 8,
widget = forms.PasswordInput(render_value=False, attrs={'class':'input hidden'}))
password2 = forms.CharField(required=False, min_length = 8,
widget = forms.PasswordInput(render_value=False, attrs={'class':'input hidden'}))
institution = forms.CharField(required=False,
widget = forms.TextInput(attrs={'class':'input', 'autocomplete':'off'}))
logo = forms.ImageField(required=False)
def clean_username(self):
username = self.cleaned_data.get('username').lower()
print username
try:
u = User.objects.exclude(pk=self.request.user.id).get(username__iexact=username)
except User.DoesNotExist:
return username
raise forms.ValidationError(u'Este nombre de usuario ya existe.')
def clean_email(self):
email = self.cleaned_data.get('email')
try:
e = User.objects.exclude(pk=self.request.user.id).get(email__iexact=email)
except User.DoesNotExist:
return email
raise forms.ValidationError(u'ya existe un usuario asociado a este correo electrónico.')
def clean_password2(self):
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
if not(password1 and password2):
pass
elif not password2:
raise forms.ValidationError("Debes confirmar la contraseña")
if password1 != password2:
raise forms.ValidationError("Las contraseñas no coinciden")
return password2
当前视图只更新用户模型:
class UpdateProfile(FormView):
model = User
template_name = 'general/perfil.html'
form_class = UserProfileForm
def get_initial(self):
initial = super(UpdateProfile, self).get_initial()
initial['username'] = self.request.user.username
initial['name'] = self.request.user.first_name
initial['lastname'] = self.request.user.last_name
initial['email'] = self.request.user.email
try:
profile = UserProfile.objects.get(user=self.request.user)
except UserProfile.DoesNotExist:
profile = None
if profile:
initial['institution'] = profile.institution
return initial
def get_form_kwargs(self):
kwargs = super(UpdateProfile, self).get_form_kwargs()
kwargs.update({'request' : self.request})
return kwargs
def form_valid(self, form):
user = get_object_or_404(User, pk= self.request.user.id)
user.username = form.cleaned_data['username'],
user.first_name = form.cleaned_data['name'],
user.last_name = form.cleaned_data['lastname'],
user.email = form.cleaned_data['email']
if form.cleaned_data['change_password']:
user.password = form.cleaned_data['password1']
user.save()
return HttpResponseRedirect('/profile')
可能是 form.cleaned_data 方法的问题? 有什么想法吗?
【问题讨论】:
-
“用户模型正在更新,没有 unicode 渲染”什么?
-
是的,例如当我输入名称输入 Andrés 并提交表单时,用户模型会更新为名称 (u'Andr\xe9s',)
-
天哪。您似乎将密码作为纯文本保存在数据库中。 永远、永远、永远、永远这样做。无论如何,Django 包含一个非常好的身份验证框架,您几乎应该总是使用它,而不是自己动手。
-
我认为 save 方法在内部管理密码哈希。我会立即修复,谢谢您的建议。
标签: django django-forms django-views django-users