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

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

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

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

Python

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

Q&A

解決済

1回答

2529閲覧

djangoオブジェクトの有無を判定し、画面遷移する

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

0クリップ

投稿2020/10/06 01:07

前提・実現したいこと

django初心者です。
1対1のユーザーテーブルと企業テーブルを作成しています。
ユーザーはdjango-allauthを使用しています。
ユーザーが企業登録をしていれば、詳細表示のDetailViewに、
していなければ新規作成のCreateViewに遷移する機能を作成したいです。

・models.py

python

1class Company(models.Model): 2 user = models.ForeignKey(CustomUser,verbose_name='ユーザー名',on_delete=models.PROTECT) 3 company_name = models.CharField(verbose_name='会社名',max_length=50, blank=True, null=True) 4 department = models.CharField(verbose_name='部署名',max_length=100, blank=True, null=True) 5 charge_of_person = models.CharField(verbose_name='ご担当者様',max_length=50, blank=True, null=True) 6 postal_code = models.CharField(verbose_name='郵便番号',max_length=50, blank=True, null=True) 7 address1 = models.CharField(verbose_name='住所1',max_length=100, blank=True, null=True) 8 address2 = models.CharField(verbose_name='住所2',max_length=100, blank=True, null=True) 9 email = models.CharField(verbose_name='メールアドレス',max_length=50, blank=True, null=True) 10 tel = models.CharField(verbose_name='電話番号',max_length=50, blank=True, null=True) 11 fax = models.CharField(verbose_name='FAX番号',max_length=50, blank=True, null=True) 12 created_date = models.DateTimeField(auto_now_add = True) 13 updated_date = models.DateTimeField(auto_now = True)

・urls.py

python

1from django.urls import path 2 3from . import views 4 5app_name = 'appname' 6 7urlpatterns=[ 8 path('',views.IndexView.as_view(),name = 'index'), 9 path('company_detail/<int:pk>',views.CompanyDetailView.as_view(),name = 'company_detail'), 10 path('company_create/',views.CompanyCreateView.as_view(), name='company_create'),

・views.py

python

1from django.contrib.auth.mixins import LoginRequiredMixin 2from django.urls import reverse,reverse_lazy 3from django.views import generic 4from .models import Company 5 6class IndexView(LoginRequiredMixin,generic.TemplateView): 7 template_name = 'index.html' 8 9 def get(self, request, **kwargs): 10 try: 11 company = Company.objects.get(user = self.request.user) 12 13 except company.DoesNotExist: 14 return reverse('appname:company_create') 15 16 return reverse('appname:company_detail', kwargs={'pk': company.id})

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

local variable 'company' referenced before assignment

試したこと

・view.py

python

1class IndexView(LoginRequiredMixin,generic.TemplateView): 2 template_name = 'index.html' 3 4 def get(self, request, **kwargs): 5 try: 6 company = Company.objects.get(user = 1)# ← 1を入れてみました 7 8 except company.DoesNotExist: 9 return reverse('appname:company_create') 10 11 return reverse('appname:company_detail', kwargs={'pk': company.id})

エラー

'str' object has no attribute 'get'

わからないこと
1.self.request.userをどこで取得したらいいのか
2.オーバーライドするメソッドはgetでいいのか
他に良い書き方があればご教授頂きたいと思います。
よろしくお願いします。

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

django=2.2
pyhton=3.8
mysql=14.14 Distrib 5.7.31

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記のようにしてみました。
.exists()関数を使用しています。

Python

1# views.py 2from django.contrib.auth.mixins import LoginRequiredMixin 3from django.http import HttpResponseRedirect 4# from django.shortcuts import redirect # HttpResponseRedirectの代わりにredirect()関数を使うときのimport 5from django.urls import reverse,reverse_lazy 6from django.views import generic 7from .models import Company 8 9class IndexView(LoginRequiredMixin,generic.TemplateView): 10 template_name = 'index.html' 11 12 def get(self, request, **kwargs): 13 user = self.request.user 14 if Company.objects.filter(user=user).exists(): 15 company = Company.objects.get(user=user) 16 return HttpResponseRedirect(reverse('appname:company_detail', kwargs={'pk': company.id})) 17 # 短縮して下記のような書き方もできます、(冒頭でredirect()関数をimportする必要あり) 18 # return redirect('appname:company_detail', pk=company.id) 19 return HttpResponseRedirect(reverse('appname:company_create')) 20 # 短縮して下記のような書き方もできます。 21 # return redirect('appname:company_create') 22

投稿2020/10/06 03:46

編集2020/10/10 02:08
sfdust

総合スコア1135

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

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

退会済みユーザー

退会済みユーザー

2020/10/06 20:55

試してみましたが、エラーが出てしまいます。 企業情報を登録してある場合もしていない場合も以下が表示されます。 エラー:'str' object has no attribute 'get' 試しに企業情報を複数件(2件)持たせたデータを作ってみました。 その場合は エラー:get() returned more than one PostedCompany -- it returned 2! となります。 どうぞよろしくお願い致します。
sfdust

2020/10/09 16:20

修正しました。
退会済みユーザー

退会済みユーザー

2020/10/11 23:20

ありがとうございます! 出来ました。 書き方も丁寧に教えていただき、感謝しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問