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

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

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

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

POST

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

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

Q&A

1回答

1202閲覧

djangoで一つの投稿のみ作成可能にし、更新を繰り返したい

yayaya22

総合スコア51

Django

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

POST

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

HTML

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

0グッド

0クリップ

投稿2021/09/01 11:01

編集2021/09/02 05:44

Djangoでユーザーが投稿をし、更新できる機能をもつwebアプリを制作しています。
一つのみの投稿を許可し、そのテーブルで更新を繰り返したいです。
マイプロフィールのようなものにあたりますが、viewのpostの処理と、更新時にユーザーフォームにすでに入れている状態を作り出すことがうまくいきません。投稿時にobject.all.filterで最初の投稿を抽出すればいいと思っておりましたが、どうもうまく動作せず困っております。

allauth新規ユーザー登録→マイページ→何もない状態なので新規ポスト→フォーム入力(ここまでができています)→更新画面

プロフィールをAbstractBaseUserやカスタムユーザーではなくPost方式で制作できる方法がありましたら教示願いたく存じます。

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

こんにちは

SQLの機能を利用すれば可能で、安全です。

複合ユニーク制約を利用します。参考記事は以下です。
https://mizzsugar.hatenablog.com/?page=1561192506

その後更新し続けるというのは、単にSQLのアップデートなので、
https://docs.djangoproject.com/en/3.2/topics/db/queries/#saving-changes-to-objects
を参考に実装できます。

投稿2021/09/03 11:09

prof

総合スコア179

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

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

yayaya22

2021/09/04 12:25

こんにちは。早速ありがとうございます!参考にさせていただきます! その前にエラーが出てしまいました。 現在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のところまで飛んでいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問