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

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

ただいまの
回答率

87.80%

Djangoのpostでエラーがでます

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,120

score 11

Djangoでpostしたデータでmodelをupdateしたいのですがpostでエラーがでます。

質問が2つあるのですが、urlsが効いてないらしいのと、updateが呼ばれてないらしいことです。

testapp/views/urls.py

from django.conf.urls import url
from django.urls import include, path
from . import views
from testapp.views.user_views import UserViews
from testapp.views.get_views import GetViews

urlpatterns = [
    path('', UserViews.index, name='index'),
    path('app0/', GetViews.as_view(), ),
    path('app1/', UserViews.index, name='index'),

    path('update/', UserViews.update, name='update'),
]

testapp/templates/users.html

{% extends "base.html" %}

{% block content %}
  <form method="post" action="update/">
    {% csrf_token %}
    <table border="1">
      <thead>
        <tr>
          <th>id</th>
          <th>name</th>
          <th>created_at</th>
          <th>updated_at</th>
          <th>更新</th>
        </tr>
      </thead>
      <tbody>
        {% for user in users %}
          <tr>
            <td>
              {{ user.id }}
              <input type="hidden" name="id" id="id" value="{{ user.id }}"/>
            </td>
            <td>
              <input type="text" name="username" id="username" value="{{ user.name }}"/>
            </td>
            <td>{{ user.created_at }}</td>
            <td>{{ user.updated_at }}</td>
            <td><input type="submit" name="commit" value="更新" data-disable-with="更新" /></td>
          </tr>
        {% endfor %}
      </tbody>
    </table>
    名前 <input type="textbox" value="{{ user.name }}" name="username" />
    <input type="submit" name="commit" value="登録" data-disable-with="登録" />
  </form>
{% endblock %}

testapp/views/user_views.html

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from testapp.models.app_user import AppUser
from . import views
from django.views.generic import TemplateView
from django.urls import reverse

class UserViews(TemplateView):
    def index(request):
        print('indexに入った')
        users = {
            'users': AppUser.objects.all(),
        }
        return render(request, 'users.html', users)

    def update(self, request, *args, **kwargs):
        print('updateに入った')

        user.id = AppUser.objects.filter(field__contains="id=request.POST.get('id', None)").first()
        user.name = request.POST.get('name', None)
        user.save()
        redirect_url = reverse('update') #'testapp:user_views')
        parameters = urlencode({'id': user.id, 'name': user.name})
        url = "{redirect_url}?{parameters}"
        return redirect(url)

エラーログ

TypeError at /update/
update() missing 1 required positional argument: 'request'
Request Method:    POST
Request URL:    http://localhost:8000/update/
Django Version:    2.2.2
Exception Type:    TypeError
Exception Value:    
update() missing 1 required positional argument: 'request'
Exception Location:    /Users/js/.pyenv/versions/TensorFlow/lib/python3.6/site-packages/django/core/handlers/base.py in _get_response, line 113
Python Executable:    /Users/js/.pyenv/versions/TensorFlow/bin/python
Python Version:    3.6.5
Python Path:    
['/Users/js/work/django_proj',
 '/Users/js/.pyenv/versions/TensorFlow/lib/python36.zip',
 '/Users/js/.pyenv/versions/TensorFlow/lib/python3.6',
 '/Users/js/.pyenv/versions/TensorFlow/lib/python3.6/lib-dynload',
 '/Users/js/.local/lib/python3.6/site-packages',
 '/Users/js/.pyenv/versions/TensorFlow/lib/python3.6/site-packages',
 '/Users/js/.pyenv/versions/TensorFlow/lib/python3.6/site-packages/six-1.11.0-py3.6.egg']
Server time:    水, 22 12020 22:01:52 +0900

以上でした。
すみませんが、どうかよろしくお願いします。

質問(追記)

updateというメソッドを呼び出してmodelを更新したいのですが方法がわかりません。

情報が少し足りなかったかもしれませんので追記です。
testapp/urls.py

from django.conf.urls import url
from django.urls import include, path

urlpatterns = [
    path('', include('testapp.views.urls')),
]


がありました。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dameo

    2020/01/23 11:15

    合っているということであれば、私から言えることは何もありません。
    明らかに間違っているので。

    キャンセル

  • quickquip

    2020/01/23 12:08

    質問が書いてないですね

    キャンセル

  • JironBach

    2020/01/23 12:23 編集

    teratailの使い方がわかってませんでした。
    質問に修正・追記します。

    キャンセル

回答 1

check解決した方法

0

自己解決しました。

下記修正は質問とは異なる修正も含まれますが、とにかくpostしたデータをデータベースに更新できたコードも含めて記載しておきます。

testapp/user_views.py

下記の修正はupdateが呼ばれなかったことに関する修正です。

    def update(self, request, *args, **kwargs):def update(request):

下記はuser_views.pyのコードです。

    def update(request):
        print('updateに入った')

        userid = request.POST.get('userid', None)
        # filterを修正する時にググったコードをコピペしてしまったのがおかしかった。
        # filter_containsをid__containsに修正しました。
        # その後のイコールに余計なコードが入っていたので簡素化しました。
        user = AppUser.objects.filter(id__contains=userid).first()
        user.name = request.POST.get('username', None)
        user.save()
        # redirectのコードを簡素化
        return HttpResponseRedirect('/')

下記はhtmlのテーブルのデータをpostした修正です。

testapp/templates.html

    <tbody>
      {% for user in users %}
        <form method="post" action="update/">
          {% csrf_token %}
          <tr>
            <td>
              {{ user.id }}
              <input type="hidden" name="userid" id="userid" value="{{ user.id }}"/>
            </td>
            <td>
                <input type="text" name="username" id="username" value="{{ user.name }}"/>
            </td>
            <td>{{ user.created_at }}</td>
            <td>{{ user.updated_at }}</td>
            <td><input type="submit" name="commit" value="更新" data-disable-with="更新" /></td>
          </tr>
        </form>
      {% endfor %}
    </tbody>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/24 07:21

    TemplateViewを使わない選択をしたと思うのですが
    class UserViews(TemplateView):
    は残したままですか?

    キャンセル

  • 2020/01/30 12:27 編集

    返事遅れました。コメントありがとうございます。
    まだTemplateViewがわからないままサブクラスにしてしまいました。
    おっしゃる通り View にしても問題なく動作したので
    TemplateViewは必要なかったようです。

    キャンセル

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

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る