2017-10-18 94 views
0

我正在为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之内,但是我找不到它,即使经过了很多搜索。

预先感谢您。

+0

使用创建表单来更新对象并没有意义。特别是'UserCreation'表单有设置密码的代码。这可能会导致你的问题。将模板设置为单独的混合模式的代码可能会更好。 – Alasdair

+0

如果我知道的话,我宁愿选择这个选项。我的意思是,将模型与ModelForm'init'小部件分开将会更好。 请您参考我如何在mixin中设置模型的样式? – Khaled

+0

我不能 - 我不知道“其他一些代码”是什么 – Alasdair

回答

0

你可以尝试移动代码风格在一个单独的混入领域:

class UserStyleMixin(object): 
    def __init__(self, *args, **kwargs): 
     super(UserStyleMixin, self).__init__(*args, **kwargs) 
     # Style the fields here 

然后你就可以让你的MyUserCreationForm使用混入,创造更新视图的新形式。

class MyUserCreationForm(UserStyleMixin, UserCreationForm): 
    ... 

class UserUpdateForm(UserStyleMixin, forms.ModelForm): 
    ... 

注意,如果更新视图允许用户更改用户名,那么你还是应该检查用户名是允许的,独一无二的。如果您的模型中有用户名unique=True,Django应为您处理此问题。将用户名正则表达式移动到模型也是一个好主意。

+1

非常好!是的,我为updateview创建了一个新的ModelForm,现在它运行良好。我也做了mixin。 顺便说一下,我的User模型继承自django'AbstractUser',它已经设置了很酷的功能来检查唯一性和正确性。我删除了整个'clean_username'函数,我让django处理它。 谢谢你的回答。 – Khaled

相关问题