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

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

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

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

Python

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

Q&A

解決済

1回答

4112閲覧

djangoでviewからFormオブジェクトに値を渡したい

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

1クリップ

投稿2020/09/25 07:31

編集2020/09/28 02:40

前提・実現したいこと

django初心者です。
URLのパラメータの値を基準にFormのfieldの表示・非表示を設定したいです。

●models.py

python

1class Company(models.Model): 2 name = models.CharField(verbose_name=u'会社名',max_length=50, blank=True, null=True) 3 address = models.CharField(verbose_name=u'ご住所',max_length=100, blank=True, null=True) 4 email = models.CharField(verbose_name=u'メールアドレス',max_length=50, blank=True, null=True) 5 tel = models.CharField(verbose_name=u'電話番号',max_length=50, blank=True, null=True) 6 service_id = models.ForeignKey(Service,on_delete=models.CASCADE) 7 8class Service(models.Model): 9 service_detail= models.TextField(verbose_name=u'サービス内容',blank=True, null=True)

●forms.py

python

1class CompanyFrom(forms.ModelForm): 2 class Meta: 3 model = Company 4 fields =('name','address','email','tel') 5 6 def __init__(self, *args, **kwargs): 7 self.service_id = kwargs.pop('test_service_id') 8 super(CompanyFrom,self).__init__(*args,**kwargs) 9 if self.service_id == 1: 10 self.fields['email'].widget = forms.HiddenInput()

●views.py

python

1class CompanyCreateView(generic.CreateView): 2 template_name = 'form.html' 3 model = Company 4 form_class = CompanyFrom 5 6 def get_form_kwargs(self): 7 kwargs = super(CompanyCreateView,self).get_form_kwargs() 8 kwargs['test_service_id'] =self.kwargs['sevice_id'] #service_idはパラメータ 9 return kwargs

●urls.py

python

1from django.urls import path 2 3from . import views 4 5app_name = 'company' 6 7urlpatterns = [ 8 path('<int:company_id>/create/<int:sevice_id>', views.CompanyCreateView.as_view(), name='service_create'), 9 ]

●settings.py

python

1""" 2Django settings for config project. 3 4Generated by 'django-admin startproject' using Django 2.2.12. 5 6For more information on this file, see 7https://docs.djangoproject.com/en/2.2/topics/settings/ 8 9For the full list of settings and their values, see 10https://docs.djangoproject.com/en/2.2/ref/settings/ 11""" 12 13import os 14 15# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 18 19# Quick-start development settings - unsuitable for production 20# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ 21 22# SECURITY WARNING: keep the secret key used in production secret! 23SECRET_KEY = 'l_dil%jvy7)9f5%gr8fn(4sl0cx&tuc__o3!kf&1fzi-cw$+!e' 24 25# SECURITY WARNING: don't run with debug turned on in production! 26DEBUG = True 27 28ALLOWED_HOSTS = ['127.0.0.1'] 29 30 31# Application definition 32 33INSTALLED_APPS = [ 34 'company.apps.CompanyConfig', 35 'django.contrib.admin', 36 'django.contrib.auth', 37 'django.contrib.contenttypes', 38 'django.contrib.sessions', 39 'django.contrib.messages', 40 'django.contrib.staticfiles', 41] 42 43MIDDLEWARE = [ 44 'django.middleware.security.SecurityMiddleware', 45 'django.contrib.sessions.middleware.SessionMiddleware', 46 'django.middleware.common.CommonMiddleware', 47 'django.middleware.csrf.CsrfViewMiddleware', 48 'django.contrib.auth.middleware.AuthenticationMiddleware', 49 'django.contrib.messages.middleware.MessageMiddleware', 50 'django.middleware.clickjacking.XFrameOptionsMiddleware', 51] 52 53ROOT_URLCONF = 'config.urls' 54 55TEMPLATES = [ 56 { 57 'BACKEND': 'django.template.backends.django.DjangoTemplates', 58 'DIRS': [os.path.join(BASE_DIR, 'templates')], 59 'APP_DIRS': True, 60 'OPTIONS': { 61 'context_processors': [ 62 'django.template.context_processors.debug', 63 'django.template.context_processors.request', 64 'django.contrib.auth.context_processors.auth', 65 'django.contrib.messages.context_processors.messages', 66 ], 67 }, 68 }, 69] 70 71WSGI_APPLICATION = 'config.wsgi.application' 72 73 74# Database 75# https://docs.djangoproject.com/en/2.2/ref/settings/#databases 76 77DATABASES = { 78 'default': { 79 "ENGINE": "django.db.backends.mysql", 80 "NAME": "dbname", 81 "USER": "user", 82 "PASSWORD": "password", 83 "HOST": "hostname", 84 "PORT": "3306", 85 }, 86 "db2": { 87 "ENGINE": "sql_server.pyodbc", 88 "NAME": "dbname", 89 "USER": "user", 90 "PASSWORD": "password", 91 "HOST": "hostname", 92 "PORT": "", 93 "OPTIONS": { 94 "driver": "ODBC Driver 17 for SQL Server" 95 } 96 } 97} 98 99# Password validation 100# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators 101 102AUTH_PASSWORD_VALIDATORS = [ 103 { 104 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 105 }, 106 { 107 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 108 }, 109 { 110 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 111 }, 112 { 113 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 114 }, 115] 116 117 118# Internationalization 119# https://docs.djangoproject.com/en/2.2/topics/i18n/ 120 121LANGUAGE_CODE = 'ja' 122 123TIME_ZONE = 'Asia/Tokyo' 124 125USE_I18N = True 126 127USE_L10N = True 128 129USE_TZ = True 130 131 132# Static files (CSS, JavaScript, Images) 133# https://docs.djangoproject.com/en/2.2/howto/static-files/ 134 135STATIC_URL = '/static/' 136STATICFILES_DIRS = ( 137 os.path.join(BASE_DIR, "static"), 138) 139

●form.html

html

1{% extends 'base.html' %} 2 3{% block content %} 4<div> 5 <h4>企業情報</h4> 6 7 <form method="post"> 8 <table> 9 {% csrf_token %} 10 {{ form.as_p }} 11 </table> 12 <input type="submit" value="保存"> 13 </form> 14 15</div> 16{% endblock %}

ディレクトリ構造

myproject |_company |___pycache__ |_migrations |___init__.py |_admin.py |_forms.py |_models.py |_tests.py |_urls.py |_views.py |_config |___pycache__ |___init__.py |_settings.py |_urls.py |_wsgi.py |_templates |_company |_form.html |_base.html

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

__init__() got an unexpected keyword argument 'test_service_id'

試したこと

●views.py

python

1class CompanyCreateView(generic.CreateView): 2 template_name = 'form.html' 3 model = Company 4 form_class = CompanyFrom 5 6 def get_form_kwargs(self): 7 kwargs = super(CompanyCreateView,self).get_form_kwargs() 8 kwargs['test_sevice_id'] = 1 # ← パラメータが取れていないのかと思い、1を入れてみる 9 return kwargs

やはり同じエラーが発生しました。
エラー内容から引数の設定の問題かもしれませんが、よくわかりません。
よろしくお願いします。

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

django=2.2
pyhton=3.8
mysql=14.14 Distrib 5.7.31

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

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

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

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

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

sfdust

2020/09/27 03:14

ディレクトリ構成、urls.pysettings.py、templatesディレクトリ下のHTMLファイルのソースも示してください。
退会済みユーザー

退会済みユーザー

2020/09/27 23:23 編集

追記しました。 記載漏れ、記入ミス等ありましたら、ご指摘よろしくお願いします。
guest

回答1

0

ベストアンサー

下記のように直してみた場合いかがでしょうか。

●forms.py
※修正点→ __init__(...)関数について、修正前ではMetaクラスの直下に入っていますが、そうせずに、インデントを一段上げます。
(=__init__(...)関数をCompanyFromクラス直下の関数にします)

from django import forms from .models import Company class CompanyFrom(forms.ModelForm): class Meta: model = Company fields =('name','address','email','tel') def __init__(self, *args, **kwargs): # <======ここのインデントを一段上げる self.service_id = kwargs.pop('test_service_id') super(CompanyFrom,self).__init__(*args,**kwargs) if self.service_id == 1: self.fields['email'].widget = forms.HiddenInput()

views.py、 urls,pyは下記のように元のままで構いません。
(元ソースでservice_idがsevice_idとなっていますが、そのままにしています)

●views.py (変更なし)
(kwargs['test_service_id'] =self.kwargs['sevice_id']  に修正済み)

from django.views import generic from .models import Company from .forms import CompanyFrom class CompanyCreateView(generic.CreateView): template_name = 'form.html' model = Company form_class = CompanyFrom def get_form_kwargs(self): kwargs = super(CompanyCreateView,self).get_form_kwargs() kwargs['test_service_id'] =self.kwargs['sevice_id'] #service_idはパラメータ return kwargs

●urls.py (変更なし)

from django.urls import path from . import views app_name = 'company' urlpatterns = [ path('<int:company_id>/create/<int:sevice_id>', views.CompanyCreateView.as_view(), name='service_create'), ]

※その他:
From <--> Form
sevice <--> service
等、変数のtypoが気になりました。

pythonはツールやライブラリを使わない限り事前の型チェックをデフォルトで行いませんし、
辞書型や属性付加等により動的なプログラミングを行う場面も多いため、
typoを放置すると思わぬところでハマることがあります。
なるべく正しい単語で変数を使うことをお勧めします。

また、質問元のソースのうち、forms.py等でimport文が省略されていましたが
djangoはいろいろなライブラリの関数とともに
自分で定義したmodelやformをimportして利用することが多いため、
省略せず記載していただくとこちらで再現しバグをチェックするときに助かります。
(一番の理想は、本当にプロジェクトの全てのソースを記載していただいて、こちらでもバグを完全に再現できるようになることです。秘密保持等で難しいかもしれませんが)

投稿2020/09/28 00:48

編集2020/09/29 23:43
sfdust

総合スコア1135

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

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

退会済みユーザー

退会済みユーザー

2020/09/28 02:41

コピペしたつもりでしたが、スペルミスしていました...スミマセン。 しかし同じエラーが出てしまいます。
sfdust

2020/09/29 14:45

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

退会済みユーザー

2020/09/29 23:12

表題の件は__init__(...)関数のインデントの修正で解決しました。 スペルミスについては、これまでもちょくちょくハマっていたので気をつけていきたいです。 質問の方法など、ご丁寧にご指摘いただき大変助かります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問