2017-10-18 9 views
0

Userモデル用にUpdateView UpdateAccountViewを作成しています。これは、既に新しいユーザーの作成に使用されているModelForm MyUserCreationFormです。問題は、[Submit]をクリックしてテンプレートの変更を保存するたびに、テンプレートが再レンダリングされることです。Django UpdateViewは、ModelFormを使用して新規ユーザーか既存ユーザーかを保存しない

たとえば、私がフィールドを変更しなかった場合、「Username is already taken」というエラーが表示されます。MyUserCreationFormで一意のユーザー名を確認するか、新しいエントリのテンプレートを再レンダリングします実際にはモデルに変更を保存する必要はありません。ここで

はしかし、私が直接UpdateViewにモデルとフィールドを使用してモデルを更新した場合、それが動作する私の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 

良い。しかしレンダリング時にスタイルを制御できるようにするには、ModelFormでそれを行う必要があります。

私は問題がModelFormにあることを知っていますが、多くを検索してもそれを見つけることはできません。

ありがとうございます。

+0

オブジェクトを更新するために作成フォームを使用するのは実際には意味がありません。特に、 'UserCreation'フォームはパスワードを設定するコードを持っています。問題を引き起こす可能性があります。テンプレートのスタイルを決めるコードを別のミックスインに分解する方がよいかもしれません。 – Alasdair

+0

私が知っていれば、私はむしろこのオプションのために行くだろう。私は、ModelFormの 'init'ウィジェットからスタイルを分離する方が良いと言います。 mixinでmodelformのスタイルを設定する方法を教えてください。 – 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

関連する問題