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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

822閲覧

会員登録の時にアップロードしたプロフィール写真をきちんとDB上にも保存できるようにしたい

momonga8316

総合スコア2

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/11 03:21

前提・実現したいこと

会員登録の時に、プロフィール写真をアップロードしてもらうのですが、
現在、サイト上の登録ページからアップロードしてもデータベースに保存されていない状態です。

※adminページ、管理サイトから直接アップロードしたら正常にデータベースに反映されているので、modelsのupload to (保存先の指定方法)は間違っていないのだと思っています。

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

サイトの会員登録ページから画像をアップロードしてもデータベースに画像のデータが保存されない。

該当のソースコード

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

register_form.py

python

1from django.core.exceptions import ObjectDoesNotExist 2from django.contrib.auth.models import User 3from django.contrib.auth.forms import UserCreationForm 4from django import forms 5from stokee.models import Profile 6from django.contrib.auth import get_user_model 7User = get_user_model() 8 9class RegisterForm(UserCreationForm): 10 full_name = forms.CharField(required=True) # 11 company = forms.CharField(required=False) # 12 position = forms.CharField(required=True) # 13 image = forms.ImageField(required=False) #'プロフィール画像' 14 introduce = forms.CharField(widget=forms.Textarea,required=False) #'自己紹介文' 15 URL = forms.URLField(required=True) #'TwitterURL' 16 17 class Meta: 18 model = User 19 fields = ['username', 'email', 'password1', 'password2','full_name','image','company','position','introduce','URL' ] 20 labels = { 21 'username': 'ユーザー名', 22 'email': 'メールアドレス', 23 'password1': 'パスワード', 24 'password2': 'パスワード確認', 25 'full_name': '氏名', 26 'company': '所属先/会社名', 27 'position': '役職', 28 'image': 'プロフィール画像', 29 'introduce': '自己紹介', 30 'URL': 'URL', 31 } 32 33 def save(self, commit=True): 34 if not commit: 35 raise NotImplementedError('Cannot create User and Profile without database save') 36 37 user = super().save() 38 39 40 user_id = self.cleaned_data['username'] 41 full_name = self.cleaned_data['full_name'] 42 company = self.cleaned_data['company'] 43 position = self.cleaned_data['position'] 44 image = self.cleaned_data['image'] 45 introduce = self.cleaned_data['introduce'] 46 URL = self.cleaned_data['URL'] 47 48 profile = Profile(id=user_id,full_name=full_name,company=company,position=position,image=image,user_id=user.id,introduce=introduce,URL=URL) 49 profile.save() 50 51 return user 52 53 def clean_email(self): 54 email = self.cleaned_data['email'] 55 User.objects.filter(email=email, is_active=False).delete() 56 return email

register.py

python

1from django.views.generic import TemplateView 2from django.views.generic.edit import CreateView 3from django.urls import reverse_lazy 4from django.conf import settings 5from django.contrib.auth.models import User 6from django.contrib.sites.shortcuts import get_current_site 7from django.core.signing import BadSignature, SignatureExpired, loads, dumps 8from django.http import Http404, HttpResponseBadRequest, HttpResponse 9from stokee.register_form import RegisterForm 10 11class RegisterView(CreateView): 12 template_name = 'registration/register_form.html' 13 form_class = RegisterForm 14 def form_valid(self, form): 15 """仮登録と本登録用メールの発行.""" 16 # 仮登録と本登録の切り替えは、is_active属性を使うと簡単です。 17 # 退会処理も、is_activeをFalseにするだけにしておくと捗ります。 18 user = form.save() 19 user.is_active = False 20 user.save() 21 22 email = form.cleaned_data['email'] 23 print(email) 24 25 # アクティベーションURLをメールで送付 26 current_site = get_current_site(self.request) 27 domain = current_site.domain 28 29 subject = "StoKee - Register" 30 message = f"{ email }様、ご登録いただきありがとうございます。下記リンクをクリックして登録を完了して下さい:\n\n {self.request.scheme}://{domain}/accounts/register/validation/{dumps(user.pk)}\n" 31 32 print(subject, message) 33 user.email_user(subject, message) 34 35 return HttpResponse("<h1>送信したメールのリンクから本登録を行って下さい。</h1>") 36 37register_view = RegisterView.as_view() 38 39 40class ValidationView(TemplateView): 41 template_name = "registration/register_validation.html" 42 timeout_seconds = getattr(settings, 'ACTIVATION_TIMEOUT_SECONDS', 60*60*24) # デフォルトでは1日以内 43 44 def get(self, request, **kwargs): 45 """tokenが正しければ本登録.""" 46 token = kwargs.get('token') 47 try: 48 user_pk = loads(token, max_age=self.timeout_seconds) 49 50 # 期限切れ 51 except SignatureExpired: 52 return HttpResponseBadRequest() 53 54 # tokenが間違っている 55 except BadSignature: 56 return HttpResponseBadRequest() 57 58 # tokenは問題なし 59 else: 60 try: 61 user = User.objects.get(pk=user_pk) 62 except User.DoesNotExist: 63 return HttpResponseBadRequest() 64 else: 65 if not user.is_active: 66 # 問題なければ本登録とする 67 user.is_active = True 68 user.save() 69 return super().get(request, **kwargs) 70 71 return HttpResponseBadRequest() 72 73validation_view = ValidationView.as_view() 74 75 76class DoneView(TemplateView): 77 template_name = 'registration/register_done.html' 78 79done_view = DoneView.as_view() 80 81

urls.py

python

1 2urlpatterns = [ 3 # stokee アプリケーションの URL 設定を追加 4 path('', index, name='index'), 5 path('stokee/', include('stokee.urls')), 6 path('stokee/', include('social_django.urls', namespace='social')), 7 8 # 管理サイト 9 path('admin/', admin.site.urls), 10 path('accounts/', include('django.contrib.auth.urls')), 11 path('accounts/register/', register_view, name='register'), 12 path('accounts/register/validation/<token>/', validation_view, name='create_complete'), 13 path('accounts/register/done', done_view, name='register_done'), 14 15] 16 17urlpatterns += staticfiles_urlpatterns() 18urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

setting.py

python

1 2MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 3MEDIA_URL = '/media/' 4

試したこと

register_form.pyのところで、画像を保存するよう別途コードを書く必要があるのか?
などこの辺り
djangoでDBに画像を保存して表示するまでする方法はじめてのDjango (7) 画像データの管理やページへの表示,アップロードの方法などについて知ろう)を試してみましたが、上手く行きませんでした。

すみませんが、コードを見て、どこを修正すれば、サイトページの会員登録フォームからデータベースに画像のデータが保存されるかを教えていただけると助かります。

よろしくお願いいたします。

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

MacM1
shell zsh

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました!

python

1<form enctype="multipart/form-data" method="post" action="">

formの中に、enctype="multipart/form-data"を追加したらできました。

投稿2021/09/11 06:10

momonga8316

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問