前提・実現したいこと
現在Django-allauthを利用して、ユーザー自身でプロフィールを編集できる画面を作成しています。
編集したい項目は、{ユーザー名、姓、名、住所、電話番号}です。
(ユーザー名のみunique=Trueです。)
下記コードの場合、編集フォーム画面は正常に表示されます。
しかし、ユーザー名を変更せずにその他の項目を変更すると「同じユーザー名が既に登録済みです。」と表示され、プロフィールを更新できません。
(ユーザー名を変更した場合は、正常に上書き保存されます。)
ユーザー名を変更しない場合でも、正常に動作するようにするにはどこを直せば良いのでしょうか?
どうか力を貸してください。。
発生している問題・エラーメッセージ
該当のソースコード
forms
1class ProfileForm(forms.ModelForm): 2 class Meta: 3 model = CustomUser 4 fields = ('username', 'first_name', 'last_name', 'address', 'tel') 5 labels = { 6 'username': 'ユーザー名', 'first_name': '名', 'last_name': '性', 'address': '住所', 'tel': '電話番号' 7 } 8 9 def __init__(self, username, first_name=None, last_name=None, address=None, tel=None, *args, **kwargs): 10 kwargs.setdefault('label_suffix', '') 11 super().__init__(*args, **kwargs) 12 if username: 13 self.fields['username'].widget.attrs['value'] = username 14 if first_name: 15 self.fields['first_name'].widget.attrs['value'] = first_name 16 if last_name: 17 self.fields['last_name'].widget.attrs['value'] = last_name 18 if address: 19 self.fields['address'].widget.attrs['value'] = address 20 if tel: 21 self.fields['tel'].widget.attrs['value'] = tel 22 23 def update(self, user): 24 user.username = self.cleaned_data['username'] 25 user.first_name = self.cleaned_data['first_name'] 26 user.last_name = self.cleaned_data['last_name'] 27 user.address = self.cleaned_data['address'] 28 user.tel = self.cleaned_data['tel'] 29 user.save()
views
1class EditView(LoginRequiredMixin, FormView): 2 template_name = "accounts/profile_edit.html" 3 form_class = ProfileForm 4 success_url = reverse_lazy('accounts:profile') 5 6 def form_valid(self, form): 7 form.update(user=self.request.user) 8 return super().form_valid(form) 9 10 def get_form_kwargs(self): 11 kwargs = super().get_form_kwargs() 12 kwargs.update({ 13 'username': self.request.user.username, 14 'first_name': self.request.user.first_name, 15 'last_name': self.request.user.last_name, 16 'address': self.request.user.address, 17 'tel': self.request.user.tel, 18 }) 19 return kwargs
プロフィール編集フォームで、変更していない(初期値のままの)ユーザー名だとバリデーションエラーになってしまいます。。
あなたの回答
tips
プレビュー