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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

2102閲覧

DjangoのPOST(投稿・更新)処理が機能しない

yayaya22

総合スコア51

Django

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/09/05 03:20

viewのpostの処理と、更新時にユーザーフォームにすでに入れている状態を作り出すことがうまくいきません。
現在admin画面で一行だけ<Post_datail>モデルにデータ保存をしています。
そして、edit.htmlに遷移するときに

TypeError at /users/2/edit/
'QuerySet' object does not support item assignment
Request Method: GET
Request URL: http://127.0.0.1:8000/users/2/edit/
Django Version: 3.0.4
Exception Type: TypeError
Exception Value:
'QuerySet' object does not support item assignment
Exception Location: C:*****\views.py in UsersEdit, line 197

というエラーが出ています。
197行目はviews.pyのUsersEdit関数の

else:
data['form'] = UserForm() ←こちらの部分にあたります。

formにinstance= dataがセットされずに飛ばしてUserFormのところまで飛んでいます。

forms.py from django import forms from .models import Post_Detail class UserForm(forms.ModelForm): class Meta: model = Post_Detail fields = ['name','like']
models.py from django.contrib.auth.models import User from django.db import models from django.utils import timezone from django.contrib.auth import get_user_model class Post_Detail(models.Model): name = models.CharField('名前', max_length=100) like = models.CharField('好きなもの', max_length=100) regist_date = models.DateTimeField(default=timezone.now) author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) def __str__(self): return self.author.username
urls.py from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), path('users/<int:user_id>/', views.MyPage, name='mypage'), path('users/<int:user_id>/create/', views.create, name='create'), path('users/<int:user_id>/edit/', views.UsersEdit, name='edit'), ]
views.py from django.contrib import auth from django.conf import settings from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.shortcuts import render, redirect,get_object_or_404 from .forms import UserForm,UserEditForm from .models import Post_Detail @login_required def MyPage(request,user_id): user_id = request.user.id User.objects.get(pk = user_id) data = Post_Detail.objects.filter(author=user_id) params = {'message': 'mypage', 'data': data} return render(request, 'mypage.html', params) @login_required def create(request,user_id): User.objects.get(pk = user_id) params = {'message': '', 'form': None} if request.method == 'POST': form = UserForm(request.POST) if form.is_valid(): instance = form.save(commit=False) instance.author = request.user instance.save() return redirect('mypage') else: params['message'] = '再入力して下さい' params['form'] = form else: params['form'] = UserForm() return render(request, 'create.html', params) @login_required def UsersEdit(request,user_id): User.objects.get(pk = user_id) data = get_object_or_404(Post_Detail, user_id) if request.method == 'POST': form = UserForm(request.POST,instance=data) if form.is_valid(): instance = form.save(commit=False) instance.author = request.user instance.save() return redirect('edit') else: data['message'] = '再入力して下さい' data['form'] = form else: data['form'] = UserForm() return render(request, 'create.html', data)

HTML

1 2mypage.html 3 4{% extends 'base.html' %} 5{% load static %} 6{% block title %}マイページ{% endblock title %} 7 8{% block content %} 9{% if request.user.is_authenticated %} 10<div class="container"> 11 <h4 class="mt-4 border-bottom">マイページ</h4> 12 <a href="#" class="btn btn-primary btn-sm my-3">変更する</a> 13 <table class="table table-striped table-bordered"> 14 <thead> 15 <tr> 16 <th scope="col">ログイン中ユーザー名</th> 17 <th scope="col">ユーザーアカウント名</th> 18 <th scope="col">すきなもの</th> 19 </tr> 20 </thead> 21 <tbody> 22 {% for Post_Detail in data %} 23 <tr> 24 <td>{{ Post_Detail.author }}</td> 25 <td>{{ Post_Detail.name }}</td> 26 <td>{{ Post_Detail.like }}</td> 27 </td> 28 </tr> 29 {% endfor %} 30 </tbody> 31 </table> 32 </div> 33{% endif %} 34{% endblock content %} 35

HTML

1 2create.html 3 4{% extends 'base.html' %} 5{% load static %} 6 7 <body> 8 {% block content %} 9 <form method="post"> 10 {% csrf_token %} 11 {{ form.as_p }} 12 <button type="submit" name="submit">Submit</button> 13 </form> 14{% endblock %} 15 </div> 16 </body> 17</html> 18

HTML

1 2edit.html 3 4 {% extends 'base.html' %} 5 {% load static %} 6 7 <body> 8 9 {% block content %} 10 <h2>ユーザ編集</h2> 11 <form method="post"> 12 {% csrf_token %} 13 {{ form.as_p }} 14 <button type="submit" name="submit">Submit</button> 15 </form> 16 {% endblock %} 17 </div> 18 </body> 19 </html>

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

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

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

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

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

guest

回答1

0

UsersEditの変数dataはクエリセットであり辞書ではないでdata['form']でエラーが起きます。
なのでcreateと同じようにparamsのような返却ようの辞書を別で作成した方が良いかと思います。

@login_required def UsersEdit(request,user_id): params = {'message': '', 'form': None} User.objects.get(pk = user_id) data = get_object_or_404(Post_Detail, pk=user_id) if request.method == 'POST': form = UserForm(request.POST,instance=data) if form.is_valid(): instance = form.save(commit=False) instance.author = request.user instance.save() return redirect('edit') else: params['message'] = '再入力して下さい' params['form'] = form else: params['form'] = UserForm() return render(request, 'create.html', params)

投稿2021/09/06 03:54

編集2021/09/07 01:47
holy_

総合スコア364

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

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

yayaya22

2021/09/06 12:52

ありがとうございます!別辞書を用意するということで解釈させていただきました。しかしエラーが出てしまいました。 TypeError at /users/2/edit/ cannot unpack non-iterable int object Request Method: GET Request URL: http://127.0.0.1:8000/users/2/edit/ Django Version: 3.0.4 Exception Type: TypeError response = get_response(request) … ▼ Local vars Variable Value exc TypeError('cannot unpack non-iterable int object') get_response <bound method BaseHandler._get_response of <django.core.handlers.wsgi.WSGIHandler object at 0x00000124D219D748>> request <WSGIRequest: GET '/users/2/edit/'> ※以下は太字の部分でした※ data = get_object_or_404(Post_Detail,user_id) … ▼ Local vars Variable Value params {'form': None, 'message': ''} request <WSGIRequest: GET '/users/2/edit/'> user_id 2
yayaya22

2021/09/07 11:31

ありがとうございます!エラーが出てしまいました。 Page not found (404) Request Method: GET Request URL: http://127.0.0.1:8000/users/2/edit/ Raised by: subscriptions.views.UsersEdit No Post_Detail matches the given query.
yayaya22

2021/09/07 23:30

ありがとうございます、 DBの存在は、 data = Post_Detail.objects.filter(author=user_id) print(data) としましたら <QuerySet [<Post_Detail: Post_Detail object (41)>]> とかえってきましたが、 この行に飛んでしまっているようです。 else: params['form'] = UserForm() return render(request, 'create.html',params )
holy_

2021/09/08 03:05

リクエストメソッドがpostであるか確認してみてください
yayaya22

2021/09/08 11:29

はい、postです。 if request.method == 'POST': form = UserForm(request.POST,instance=data) if form.is_valid(): instance = form.save(commit=False) print(instance) instance.author = request.user instance.save() return redirect('edit.html')
holy_

2021/09/12 21:03

申し訳ありません。処理を考えてみましたがなぜそこに飛ぶのかは理解できませんでした。 if文のインデントとかは実際のでコード通りなのでしょうか?いま掲示させているのもだとインデントエラーが起きて再現できませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問