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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

972閲覧

django、FormMixinとDetailViewのページから、指定した宛先にメールを送りたい

hiranohirano

総合スコア33

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/02/19 01:37

編集2019/02/19 01:43

前提・実現したいこと

FormMixinとDetailViewのページから問い合わせを送りたいです。
問い合わせの送り先をDetailViewで指定したmodelが持つ属性のメールアドレスに送りたいのですが、うまくいきません。

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

色々試してみたのですが、NameErrorやKeyErrorやAttributeErrorが出ています。

NameError name 'kwargs' is not defined KeyError 'store_id' AttributeError 'ApplicationForm' object has no attribute 'kwargs'

ApplicationFormの以下の箇所を

store = get_object_or_404(Store, pk=kwargs['store_id'])

以下に変更するとうまくいくので、

store = get_object_or_404(Store, pk=1)

ここを修正すればうまくいく気がしています。

該当のソースコード

models.py

class Store(models.Model): name = models.CharField(verbose_name='店舗名', max_length=100) recruitment_email = models.EmailField(verbose_name='メールアドレス', blank=True)

urls.py

path('store<int:store_id>/recruit/', RecruitDetailView.as_view(), name='recruit_detail'),

views.py

class RecruitDetailView(FormMixin, DetailView): queryset = Store.objects.all() pk_url_kwarg = 'store_id' form_class = ApplicationForm template_name = "app/store_recruit.html" def get_success_url(self): return resolve_url('app:index') def get_context_date(self, **kwargs): context = super().get_context_data(**kwargs) context['form'] = self.get_form() return context def post(self, request, *args, **kwargs): self.object = self.get_object() form = self.get_form() if form.is_valid(): return self.form_valid(form) else: return self.form_invalid(form) def form_valid(self, form): form.send_email() return super(RecruitDetailView, self).form_valid(form)

forms.py

class ApplicationForm(forms.Form): name = forms.CharField(label='名前', max_length=100, widget=forms.TextInput(attrs={'class':'form-control'})) def send_email(self): name = self.cleaned_data['name'] context = { 'name': name, } subject = '応募がありました' mail_template = get_template('app/mail_template/contact/application.txt') message = mail_template.render(context) from_email = settings.DEFAULT_FROM_EMAIL store = get_object_or_404(Store, pk=kwargs['store_id']) store_mail = store.recruitment_email to = [settings.DEFAULT_FROM_EMAIL, store_mail] send_mail(subject, message, from_email, to)

試したこと

store = get_object_or_404(Store, pk=kwargs['store_id'])

の箇所を

store = get_object_or_404(Store, pk=self.kwargs['store_id']) store = get_object_or_404(Store, store_id=kwargs['store_id']) store = get_object_or_404(Store, store_id=self.kwargs['store_id'])

にしたり、

def send_email(self):

def send_email(self, **kwargs):

にしてみましたが、できませんでした。

お分かりになる方、何卒宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

store_idをどこで取得させるかが悩ましいですね。

forms.Formクラスの中でget_context_dataメソッドなどが使えればデータ取れる気もするのですが、多分使えないですよね。。
もしくは、htmlファイルの中でstore_idをhtmlのhidden属性として取得してそのデータを引っ張ってきてもよいかもしれません。

もしくく、(コード書いている中で恐縮なのですが)、ModelFormを使ってはいかがでしょうか??

投稿2019/02/19 05:40

ryotax

総合スコア142

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

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

hiranohirano

2019/02/19 07:41

アドバイスいただきありがとうございます!下の方からいただいたアドバイスで何とか解決できました!
guest

0

ベストアンサー

send_email関数をviews.pyに書くのはどうでしょうか?

というのもURLパラメータにはformから直接アクセスすることができないからです。
views.pyならkwargs['store_id']にアクセスできるはずです。

投稿2019/02/19 05:38

編集2019/02/19 05:43
alpaka

総合スコア170

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

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

hiranohirano

2019/02/19 07:41

ありがとうございます。views.pyの中にsend_email関数を書いたら出来ました! もともとforms.pyの中で、def send_email(self):以下に書いていた内容を、views.pyの def form_valid(self, form):以下に少し修正して入れたらできました。アドバイスいただきありがとうございました!
alpaka

2019/02/19 07:53

解決できたとのことでよかったです! 余談ですが、「*args,**kwargs」はDjangoに限らずPythonを使う上での超重要な基本事項です。これを理解していないと今後つまづきポイントがたくさん出ると思うので、しっかり時間を割いて意味を理解することをおすすめします。
hiranohirano

2019/02/19 13:08

ありがとうございます!早速勉強してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問