質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.38%

「Django」プロフィール編集画面における、usernameのバリデーションエラー。

受付中

回答 0

投稿 編集

flag 質問者が1日前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 44

score 1

前提・実現したいこと

現在Django-allauthを利用して、ユーザー自身でプロフィールを編集できる画面を作成しています。
編集したい項目は、{ユーザー名、姓、名、住所、電話番号}です。
(ユーザー名のみunique=Trueです。)

下記コードの場合、編集フォーム画面は正常に表示されます。

しかし、ユーザー名を変更せずにその他の項目を変更すると「同じユーザー名が既に登録済みです。」と表示され、プロフィールを更新できません。
(ユーザー名を変更した場合は、正常に上書き保存されます。)

ユーザー名を変更しない場合でも、正常に動作するようにするにはどこを直せば良いのでしょうか?

どうか力を貸してください。。

発生している問題・エラーメッセージ

イメージ説明

該当のソースコード

class ProfileForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'first_name', 'last_name', 'address', 'tel')
        labels = {
            'username': 'ユーザー名', 'first_name': '名', 'last_name': '性', 'address': '住所', 'tel': '電話番号'
        }

    def __init__(self, username, first_name=None, last_name=None, address=None, tel=None, *args, **kwargs):
        kwargs.setdefault('label_suffix', '')
        super().__init__(*args, **kwargs)
        if username:
            self.fields['username'].widget.attrs['value'] = username
        if first_name:
            self.fields['first_name'].widget.attrs['value'] = first_name
        if last_name:
            self.fields['last_name'].widget.attrs['value'] = last_name
        if address:
            self.fields['address'].widget.attrs['value'] = address
        if tel:
            self.fields['tel'].widget.attrs['value'] = tel

    def update(self, user):
        user.username = self.cleaned_data['username']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.address = self.cleaned_data['address']
        user.tel = self.cleaned_data['tel']
        user.save()
class EditView(LoginRequiredMixin, FormView):
    template_name = "accounts/profile_edit.html"
    form_class = ProfileForm
    success_url = reverse_lazy('accounts:profile')

    def form_valid(self, form):
        form.update(user=self.request.user)
        return super().form_valid(form)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs.update({
            'username': self.request.user.username,
            'first_name': self.request.user.first_name,
            'last_name': self.request.user.last_name,
            'address': self.request.user.address,
            'tel': self.request.user.tel,
        })
        return kwargs

プロフィール編集フォームで、変更していない(初期値のままの)ユーザー名だとバリデーションエラーになってしまいます。。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る