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

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

ただいまの
回答率

87.62%

プロフィール編集ページに飛んだら、ImageFieldとTextFieldのデータを保持したい

受付中

回答 0

投稿 編集

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

score 1

「実現したいこと」と 「今発生している問題」

マイページからプロフィール編集ページに飛んだとき、
models.CharField(名前など)とmodels.URLField(URL情報)の内容は保持されたままなのですが、

models.ImageField(プロフィール画像)とmodels.TextField(自己紹介)の内容を保持することができず、プロフィールページ編集ページに表示されません。

そのため、もし、プロフィール画像と自己紹介のデータを入力せずにプロフィールページを更新しようとすると、
データが空っぽ状態・デフォルトに戻ってしまうというエラーが出ます。

名前データのように、画像データとテキストデータを保持する方法を教えてもらえると助かります。

該当のソースコード

models.py

class Profile(models.Model):
    class Meta:
        verbose_name = 'ユーザー情報データ'
        verbose_name_plural = 'ユーザー情報データ'

    user = models.OneToOneField(User, verbose_name='ユーザー',null=True, blank=True, on_delete=models.CASCADE)

    id = models.CharField('ユーザーID',max_length=20,primary_key=True) # 'user_name'
    email = models.EmailField('メールアドレス', max_length=255, null=True)
    full_name = models.CharField('氏名',max_length=50)      
    company = models.CharField('所属',max_length=50)      
    position = models.CharField('役職',max_length=50)    
    image = models.ImageField(upload_to='media/images/user_image',null=True, blank=True,) # 'プロフィール画像'
    introduce = models.TextField('自己紹介',blank=True,null=True,max_length=1000) # '自己紹介文'
    URL = models.URLField() # 'TwitterURL'

    #管理画面で表示される文字列を定義する
    def __str__(self):
        #ログインログアウト機能の時に追加
        user_str = ''
        if self.user is not None:
            user_str = '(' + self.user.username + ')'

        return self.id 


mypage.py(views)

class UserChangeView(FormView):
    template_name = 'stokee/mypage_update.html'
    form_class = UserChangeForm
    success_url = reverse_lazy('stokee:mypage_top')

    def form_valid(self, form):
        #formのupdateメソッドにログインユーザーを渡して更新
        form.update(user=self.request.user.profile)
        return super().form_valid(form)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        # 更新前のユーザー情報をkwargsとして渡す
        kwargs.update({

            'full_name' : self.request.user.profile.full_name,
            'image' : self.request.user.profile.image,
            'company' : self.request.user.profile.company,
            'position' : self.request.user.profile.position,
            'introduce' : self.request.user.profile.introduce,
            'URL' : self.request.user.profile.URL,

        })
        print("1つ目")
        return kwargs

forms.py

class UserChangeForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['full_name','image','company','position','introduce','URL' ]

    def __init__(self, full_name=None, image=None, company=None, position=None, introduce=None, URL=None, *args, **kwargs):
        kwargs.setdefault('label_suffix', '')
        super().__init__(*args, **kwargs)
        # ユーザーの更新前情報をフォームに挿入

        if full_name:
            self.fields['full_name'].widget.attrs['value'] = full_name
        if image:
            self.fields['image'].widget.attrs['value'] = image
        if company:
            self.fields['company'].widget.attrs['value'] = company
        if position:
            self.fields['position'].widget.attrs['value'] = position
        if introduce:
            self.fields['introduce'].widget.attrs['value'] = introduce
        if URL:
            self.fields['URL'].widget.attrs['value'] = URL
        print("2つ目")

    def update(self, user):

        user.full_name = self.cleaned_data['full_name']
        user.image = self.cleaned_data['image']
        user.company = self.cleaned_data['company']
        user.position = self.cleaned_data['position']
        user.introduce = self.cleaned_data['introduce']
        user.URL = self.cleaned_data['URL']

        user.save()


mypage_update.html

{% extends "base.html" %}
{% load bootstrap4 %}
{% load staticfiles %}
{% block title %}マイページ情報更新ページ{% endblock title %}

{% block content %}
<div style="margin-top: 120px;"></div>

<h2>マイページ更新</h2>
<div style="margin-top: 60px;"></div>
<div class="header"><h3>ユーザー情報の変更</h3></div>
                <form enctype="multipart/form-data" class="ui form" action="" method="POST">
                    {% csrf_token %}
                    {{form.as_p}}
                    <button class="ui orange button" type="submit">確認</button>
                </form>
<div style="margin-top: 60px;"></div>


{% endblock content %}

試したこと

おそらく、forms.pyの部分で、きちんとユーザーの更新前情報をフォームに挿入することができていないのが原因だと考えています。(もしくはviewsの更新前のユーザー情報をkwargsとして渡す部分)
しかし、django ユーザー情報更新 機能 と調べても、メールアドレスやパスワード、名前くらいしか要素の例がなくて、画像や長文テキストの保持方法が見つかりません。
ぜひ、お力を貸していただけると助かります。

if image:
            self.fields['image'].widget.attrs['value'] = image

画像データの↑ここと、
自己紹介の↓ここ

if introduce:
            self.fields['introduce'].widget.attrs['value'] = introduce

補足情報(FW/ツールのバージョンなど)

MacM1
shell zsh
python 3.8

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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