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>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/04 12:25