我正在UpdateAccountView
为User
模型编写 UpdateView ,通过ModelForm进行更新,该 ModelFormMyUserCreationForm
已经是用于创建新用户的 ModelForm。问题是,每当我单击提交以保存模板中的更改时,它都会重新呈现模板。
例如,如果我没有更改任何字段,它会给我一个“用户名已被占用”的错误,我会在MyUserCreationForm
检查唯一的用户名时向您展示,或者只是为字段上的新条目重新呈现模板,实际上没有保存对模型的任何更改。
这是我的 MyUserCreationForm
class MyUserCreationForm(UserCreationForm):
class Meta:
model = User #extended from auth.models.User
fields = ("first_name", "last_name", "username", "email", "gender", "profile_photo")
# adding bootstrap styling to the ModelForm fields
def __init__(self, *args, **kwargs):
super(MyUserCreationForm, self).__init__(*args, **kwargs)
for field in iter(self.fields):
self.fields[field].widget.attrs.update({
'class': 'form-control input-lg',
'placeholder': field.replace("_", " ").title(),
'tabindex': list(self.fields).index(field) + 1})
self.fields[field].widget.attrs.pop('autofocus', None)
if field == 'username' or field == 'email':
self.fields[field].widget.attrs.update({
'placeholder': field.replace("_", " ").title() + ' *',
})
def clean_username(self):
username = self.cleaned_data['username']
if not re.search(r'^[\w.-]+$', username):
raise forms.ValidationError('Username can only contain alphanumeric characters, dots, hyphens ,and underscores')
try:
User.objects.get(username=username)
except ObjectDoesNotExist:
return username
raise forms.ValidationError('Username is already taken.')
这是视图类 UpdateAccountView
class UpdateAccountView(UpdateView):
form_class = MyUserCreationForm
model = User
template_name = 'auth/account-edit.html'
success_url = '/'
def get_object(self, queryset=None):
return self.request.user
但是,如果我通过使用模型和 中的字段直接更新模型UpdateView
,它工作正常。但是我需要通过ModelForm
来控制渲染时的样式。
所以我知道问题出在内部,ModelForm
但即使搜索了很多,我也找不到它。
先感谢您。
您可以尝试将设置字段样式的代码移动到单独的 mixin 中:
class UserStyleMixin(object):
def __init__(self, *args, **kwargs):
super(UserStyleMixin, self).__init__(*args, **kwargs)
# Style the fields here
然后你可以MyUserCreationForm
使用mixin,并为更新视图创建一个新表单。
class MyUserCreationForm(UserStyleMixin, UserCreationForm):
...
class UserUpdateForm(UserStyleMixin, forms.ModelForm):
...
请注意,如果更新视图允许用户更改用户名,那么您仍应检查用户名是否被允许且唯一。如果您unique=True
的模型中有用户名,Django 应该为您处理这个问题。将用户名正则表达式也移到模型中也是个好主意。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句