「実現したいこと」と 「今発生している問題」
マイページからプロフィール編集ページに飛んだとき、
models.CharField
(名前など)とmodels.URLField
(URL情報)の内容は保持されたままなのですが、
models.ImageField
(プロフィール画像)とmodels.TextField
(自己紹介)の内容を保持することができず、プロフィールページ編集ページに表示されません。
そのため、もし、プロフィール画像と自己紹介のデータを入力せずにプロフィールページを更新しようとすると、
データが空っぽ状態・デフォルトに戻ってしまうというエラーが出ます。
名前データのように、画像データとテキストデータを保持する方法を教えてもらえると助かります。
該当のソースコード
models.py
python
1class Profile(models.Model): 2 class Meta: 3 verbose_name = 'ユーザー情報データ' 4 verbose_name_plural = 'ユーザー情報データ' 5 6 user = models.OneToOneField(User, verbose_name='ユーザー',null=True, blank=True, on_delete=models.CASCADE) 7 8 id = models.CharField('ユーザーID',max_length=20,primary_key=True) # 'user_name' 9 email = models.EmailField('メールアドレス', max_length=255, null=True) 10 full_name = models.CharField('氏名',max_length=50) 11 company = models.CharField('所属',max_length=50) 12 position = models.CharField('役職',max_length=50) 13 image = models.ImageField(upload_to='media/images/user_image',null=True, blank=True,) # 'プロフィール画像' 14 introduce = models.TextField('自己紹介',blank=True,null=True,max_length=1000) # '自己紹介文' 15 URL = models.URLField() # 'TwitterURL' 16 17 #管理画面で表示される文字列を定義する 18 def __str__(self): 19 #ログインログアウト機能の時に追加 20 user_str = '' 21 if self.user is not None: 22 user_str = '(' + self.user.username + ')' 23 24 return self.id
mypage.py(views)
python
1class UserChangeView(FormView): 2 template_name = 'stokee/mypage_update.html' 3 form_class = UserChangeForm 4 success_url = reverse_lazy('stokee:mypage_top') 5 6 def form_valid(self, form): 7 #formのupdateメソッドにログインユーザーを渡して更新 8 form.update(user=self.request.user.profile) 9 return super().form_valid(form) 10 11 def get_form_kwargs(self): 12 kwargs = super().get_form_kwargs() 13 # 更新前のユーザー情報をkwargsとして渡す 14 kwargs.update({ 15 16 'full_name' : self.request.user.profile.full_name, 17 'image' : self.request.user.profile.image, 18 'company' : self.request.user.profile.company, 19 'position' : self.request.user.profile.position, 20 'introduce' : self.request.user.profile.introduce, 21 'URL' : self.request.user.profile.URL, 22 23 }) 24 print("1つ目") 25 return kwargs 26
forms.py
python
1 2class UserChangeForm(forms.ModelForm): 3 class Meta: 4 model = Profile 5 fields = ['full_name','image','company','position','introduce','URL' ] 6 7 def __init__(self, full_name=None, image=None, company=None, position=None, introduce=None, URL=None, *args, **kwargs): 8 kwargs.setdefault('label_suffix', '') 9 super().__init__(*args, **kwargs) 10 # ユーザーの更新前情報をフォームに挿入 11 12 if full_name: 13 self.fields['full_name'].widget.attrs['value'] = full_name 14 if image: 15 self.fields['image'].widget.attrs['value'] = image 16 if company: 17 self.fields['company'].widget.attrs['value'] = company 18 if position: 19 self.fields['position'].widget.attrs['value'] = position 20 if introduce: 21 self.fields['introduce'].widget.attrs['value'] = introduce 22 if URL: 23 self.fields['URL'].widget.attrs['value'] = URL 24 print("2つ目") 25 26 def update(self, user): 27 28 user.full_name = self.cleaned_data['full_name'] 29 user.image = self.cleaned_data['image'] 30 user.company = self.cleaned_data['company'] 31 user.position = self.cleaned_data['position'] 32 user.introduce = self.cleaned_data['introduce'] 33 user.URL = self.cleaned_data['URL'] 34 35 user.save() 36
mypage_update.html
python
1{% extends "base.html" %} 2{% load bootstrap4 %} 3{% load staticfiles %} 4{% block title %}マイページ情報更新ページ{% endblock title %} 5 6{% block content %} 7<div style="margin-top: 120px;"></div> 8 9<h2>マイページ更新</h2> 10<div style="margin-top: 60px;"></div> 11<div class="header"><h3>ユーザー情報の変更</h3></div> 12 <form enctype="multipart/form-data" class="ui form" action="" method="POST"> 13 {% csrf_token %} 14 {{form.as_p}} 15 <button class="ui orange button" type="submit">確認</button> 16 </form> 17<div style="margin-top: 60px;"></div> 18 19 20{% 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
あなたの回答
tips
プレビュー