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

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

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

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

Q&A

解決済

1回答

2675閲覧

【Django】site_detail() takes exactly 1 argument (2 given) というエラーが出る

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

0グッド

1クリップ

投稿2015/06/27 02:50

編集2015/06/27 02:54

DjangoでWebサイトを作成しており、下記の記述をしました。

lang

1#models.py 2# -*- coding: utf-8 -*- 3from django.db import models 4class Site(models.Model): 5 id = models.IntegerField('番号', blank = True, primary_key = True, unique = True) 6 name = models.CharField(u'名称', blank = True, max_length = 100)

lang

1#urls.py 2from . import views 3urlpatterns = [ 4 url(r'^owner/$', views.owner_list),#① 5 url(r'^site/([0-9]{4})/$', views.site_detail), #② 6 url(r'^site/$', views.site_list), #③ 7 url(r'^/$', views.cls_main) #④ 8]

lang

1#views.py 2def site_detail(request): 3 return HttpResponse("Hi")

この状態で、例えば、
http://127.0.0.1:8000/cls/site/2004/
とすると、
urls.pyで#②のURLが選択されて、
views,pyで設定した、
site_detailが呼び出されて、
「Hi」と表示されるだろうと考えていました。
しかし、
「TypeError at /cls/site/2004/
detail() takes exactly 1 argument (2 given)」
というエラーが出てしまいました。

Tracebackを引用すると、下記のとおりでした。

Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bootstrapform',
'cls')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware')

Traceback:
File "/usr/local/lib/python2.7/dist-packages/Django-1.8.2-py2.7.egg/django/core/handlers/base.py" in get_response
132.
response = wrapped_callback(request, *callback_args, **callback_kwargs)

Exception Type: TypeError at /cls/site/2004/
Exception Value: site_detail() takes exactly 1 argument (2 given)

どこに問題があるのか検討がつかないのですが、お分かりの方、ご教示いただけないでしょうか。
お手数をお掛けしますが、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

私の方で正確にエラーを発生させたわけではないのですが、ソースコードを拝見する限り以下のように修正したら動くのではないかと思い、回答させていただきました。

DjangoでURLに正規表現を用いる場合、変数を宣言するように名前をつける必要があります。
今回は4桁の数字のようなので、例えば「year」とすると以下のようになります。

lang

1url(r'^site/(?P<year>[0-9]{4})/$', views.site_detail),

そしてこの「year」をどこで使用するかというと、views.pyにある関数、今回では「site_detail」の引数に指定します。
よってviews.pyは以下のようになります。

lang

1def site_detail(request, year): 2 return HttpResponse("Hi")

もちろんこの「year」は関数のブロック内であれば使用できるので、以下のようにするとURLに指定した数字が表示されるはずです。

lang

1def site_detail(request, year): 2 return HttpResponse(year)

今回のエラーは、本来2つの引数を取る関数なのに「request」の一つしか指定していないために発生したのではないかと思います。

なお、今回は修正箇所のみ表示させていただきました。

もしも、このやり方でもエラーが発生した場合には、今度は私の方でも同じように再現し、また回答させていただきたいと思います。

投稿2015/06/27 03:49

takaocs

総合スコア57

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

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

退会済みユーザー

退会済みユーザー

2015/06/27 08:05

ありがとうございました。 ご指摘頂いた方法でうまくいきました。 私は、 「site_detail() takes exactly 1 argument (2 given)」 というエラーの表現を見て、 「1つの引数をとるべきなのに、2つ与えられている」 という誤訳をしていました。 「2つの引数をとるべきなのに、1つしか与えられていない」という意味なのですね。 大変わかり易くご説明頂いて、感謝しております。
takaocs

2015/06/27 08:26

こちらこそお役に立てて光栄です。 Djangoは書籍も非常に少なく、ドキュメントも英語がほとんどなのでとても勉強が難しいですが、とても良いフレームワークだと教えられ日々学習しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問