Django UpdateView不保存使用ModelForm的新用户或现有用户

时间:2017-10-18 12:43:54

标签: python django modelform

我正在为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内,但即使经过大量搜索,我也找不到它。

提前谢谢。

1 个答案:

答案 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应该为您处理此问题。将用户名正则表达式移动到模型也是一个好主意。