我正在为User
模型编写UpdateView UpdateAccountView
,通过ModelForm MyUserCreationForm
进行更新,该模型已经是用于创建新用户的ModelForm。问题在于,无论何时单击提交以将更改保存在模板中,它都会重新渲染模板。Django UpdateView不保存是否新用户或现有用户使用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
之内,但是我找不到它,即使经过了很多搜索。
预先感谢您。
使用创建表单来更新对象并没有意义。特别是'UserCreation'表单有设置密码的代码。这可能会导致你的问题。将模板设置为单独的混合模式的代码可能会更好。 – Alasdair
如果我知道的话,我宁愿选择这个选项。我的意思是,将模型与ModelForm'init'小部件分开将会更好。 请您参考我如何在mixin中设置模型的样式? – Khaled
我不能 - 我不知道“其他一些代码”是什么 – Alasdair