我正在为UpdateAccountView
模型编写UpdateView User
,通过ModelForm MyUserCreationForm
进行更新,该模型已经是用于创建新用户的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
内,但即使经过大量搜索,我也找不到它。
提前谢谢。
答案 0 :(得分:0)
您可以尝试将设置字段样式的代码移动到单独的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应该为您处理此问题。将用户名正则表达式移动到模型也是一个好主意。