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

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

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

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

Q&A

解決済

1回答

844閲覧

フォームからのメール送信でモデルに登録しているemailアドレスへ送りたい

hamakawa

総合スコア2

Django

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

0グッド

0クリップ

投稿2020/05/09 08:12

編集2020/05/09 22:58

フォームからのメール送信でモデルに登録しているemailアドレスへ送りたい

detailviewで入力された内容をmodelに登録されたemailへ送信したいのですが、メールアドレスの取得方法がわかりません。

detailviewないでのmodelの扱いいついて根本理解ができていないことが原因ですが、ご教示いただければと思います。

python

1(views.py) 2 3class Order(DetailView, FormView): 4 """商品注文""" 5 queryset = Register.objects.all() 6 template_name = 'order.html' 7 form_class = OrderForm 8 9 def get_context_data(self, **kwargs): 10 context = super().get_context_data(**kwargs) 11 context['form'] = OrderForm(initial={'TestText': Register.objects.get(pk=self.kwargs.get('pk'))}) 12 # context['shop'] = OrderForm(initial={'TestEmail': Register.objects.get(pk=self.kwargs.get('email'))}) 13 return context 14 15 def form_valid(self, form): 16 form.send_email() 17 return super().form_valid(form) 18 19

python

1(forms.py) 2 3 def send_email(self): 4 subject = 'order' 5 context = { 6 'TestText': self.cleaned_data['TestText'], 7 'customer_name': self.cleaned_data['customer_name'], 8 'customer_tel': self.cleaned_data['customer_tel'], 9 'customer_mail': self.cleaned_data['customer_email'], 10 'select_name': self.cleaned_data['select_name'], 11 'select_hour': self.cleaned_data['select_hour'], 12 } 13 message = render_to_string('testtemplate/test.txt', context) 14 name = self.cleaned_data['customer_name'] 15 email = self.cleaned_data['customer_email'] 16 from_email = '{name} <{email}>'.format(name=name, email=email) 17 recipient_list = [{{register.email}}] 18 try: 19 send_mail(subject, message, from_email, recipient_list) 20 except BadHeaderError: 21 return HttpResponse("無効なヘッダが検出されました。") 22

recipient_listに任意のメールを記入するとコンソール上ではで送信確認できています。

python

1(urls.py) 2urlpatterns = [ 3 path('thanks/', views.Thanks.as_view(), name='thanks'), 4 path('create/', views.Create.as_view(), name='create'), 5 path('list/', views.ShopList.as_view(), name='list'), 6 path('order/<int:pk>/', views.Order.as_view(), name='order'), 7 path('result/', views.OrderResult.as_view(), name='order_result'), 8 path('order_confirm_detail/<int:pk>/', views.OrderConfirm.as_view(), name='order_confirm'), 9 path('testview/', views.testview, name='testview') 10] 11

python

1(models.py) 2 3class Register(models.Model): 4 """店舗登録モデル""" 5 class Meta: 6 db_table = 'shop' 7 verbose_name_plural = '店舗登録' 8 9 name = models.CharField(verbose_name='店舗名', max_length=50) # 店舗名 10 email = models.EmailField(max_length=256, unique=True) # メールアドレス 11 tel = models.CharField(max_length=14) # 電話番号HPには公開しない 12 address = models.TextField(verbose_name='住所', null=True, blank=True) 13 text = models.TextField(max_length=256) # 店舗紹介文 14 item = models.ImageField(verbose_name='商品画像', upload_to='item_img') # 商品画像 15 shop = models.ImageField(verbose_name='店舗画像', upload_to='shop_img') # 店主画像 16 delivery1 = models.CharField(verbose_name='受け取り1', max_length=12, null=True, blank=True) # 受取1 17 delivery2 = models.CharField(verbose_name='受け取り2', max_length=12, null=True, blank=True) # 受取2 18 delivery3 = models.CharField(verbose_name='受け取り3', max_length=12, null=True, blank=True) # 受取3 19 price = models.IntegerField(default=750, null=True, blank=True) # 価格将来的に利用 20 created = models.DateTimeField(auto_now_add=True) # 登録日 21 saved = models.DateTimeField(auto_now=True) # 更新日 22 23 def __str__(self): 24 return self.name 25

###補足情報
python3.6
django2.2.1

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

HTML

1<form action="" method="POST"> 2 <div align="center" style="margin-top: 10px"> 3 4 {% csrf_token %} 5 6 <p>{{ form.TestText.as_hidden }}</p> 7 <p>注文数:{{form.select_name}}個 </p> 8 <p>受取時間:{{form.select_hour}}</p> 9 <p>お名前:{{form.customer_name}}</p> 10 <p>電話番号:{{form.customer_tel}}</p> 11 <p>メールアドレス:{{form.customer_email}}</p> 12 <button type="submit" class="btn btn-warning rounded-pill" style="margin: 5px;">この内容で注文する</button> 13 </div> 14 </form> 15

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

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

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

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

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

ForestSeo

2020/05/09 22:07

送信フォームも見せてください
guest

回答1

0

ベストアンサー

HTML上以外で[{{register.email}}]のような書き方はできません。
あとふつうはsend_mailはviews.pyの中でやると思いますので、forms.pyで作ったフォームをテンプレートに載せ、それの返り値をviewspyで確認し、送りましょう。

Python

1# (views.py) 2class Order(DetailView, FormView): 3 """商品注文""" 4 queryset = Register.objects.all() 5 template_name = 'order.html' 6 form_class = OrderForm 7 8 def get_context_data(self, **kwargs): 9 context = super().get_context_data(**kwargs) 10 context['form'] = OrderForm(initial={'TestText': Register.objects.get(pk=self.kwargs.get('pk'))}) 11 # context['shop'] = OrderForm(initial={'TestEmail': Register.objects.get(pk=self.kwargs.get('email'))}) 12 return context 13 14 def form_valid(self, form): 15 form.send_email() 16 return super().form_valid(form) 17 18 # POST送信の時 19 def post(self, request): 20 subject = 'order' 21 message = request.POST['select_name'] + request.POST['select_hour'] 22 name = request.POST['customer_name'] 23 email = request.POST['customer_email'] 24 from_email = 'from_email' 25 try: 26 send_mail(subject, message, from_email, [email]) 27 except BadHeaderError: 28 return HttpResponse("無効なヘッダが検出されました。")

投稿2020/05/10 00:06

ForestSeo

総合スコア2720

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

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

hamakawa

2020/05/10 02:05

ご回答ありがとうございます。ご指摘のとおりviewsに書きたいと思います。 言葉足らずで申し訳ありませんが、実現したいことはフォームの入力情報をメッセージとしてテンプレートに渡しmodelに登録されているemailに送信したいと考えています。 forms.pyのdef sed_mail()で送信はできるのですが、送り先のemail情報を取得する方法がわからにいます。 よろしくお願い致します。
ForestSeo

2020/05/10 02:16

送り先のemailは Register.objects.get(pk=self.kwargs.get('pk')).email で取得できると思います
hamakawa

2020/05/10 02:53

度々ありがとうございます。また、厚かましく回答依頼をしてすみませんでした。解決することができました。 modelの操作の知識が乏しいのが原因ですので、このあたりをもっと学習しようと思います。 ありがとうございました。
ForestSeo

2020/05/10 03:47

解決してよかったです。 頑張ってください!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問