Django UpdateView 不使用 ModelForm 保存新用户还是现有用户
Django UpdateView not saving whether new user or existing user using ModelForm
我正在为 User
模型编写 UpdateView UpdateAccountView
,通过 ModelForm MyUserCreationForm
进行更新,它已经是用于创建新用户的 ModelForm。问题是每当我单击提交以保存模板中的更改时,它都会重新呈现模板。
例如,如果我没有更改任何字段,它会给出 "Username is already taken" 错误,我将在 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.')
这是视图 class 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 应该会为你处理这个。将用户名正则表达式也移动到模型中是个好主意。
我正在为 User
模型编写 UpdateView UpdateAccountView
,通过 ModelForm MyUserCreationForm
进行更新,它已经是用于创建新用户的 ModelForm。问题是每当我单击提交以保存模板中的更改时,它都会重新呈现模板。
例如,如果我没有更改任何字段,它会给出 "Username is already taken" 错误,我将在 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.')
这是视图 class 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 应该会为你处理这个。将用户名正则表达式也移动到模型中是个好主意。