Django フォームを使った認証機能連携
解決したいこと
認証機能と投稿機能の連携
投稿する機能の連携中にエラーが発生しました。
解決方法を教えて下さい。
発生している問題・エラー
該当するソースコード
下記viwes.pyのform_valid内の下から二行目
viwes.py
from django.shortcuts import render,get_object_or_404,redirect
from random import randint
from .models import NippoModel
from .forms import ImageUploadForm,NippoModelForm
from django.views.generic.edit import CreateView
from django.views.generic import ListView,DetailView,FormView,DeleteView,UpdateView
from django.urls import reverse, reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin,UserPassesTestMixin
from django.contrib.auth.decorators import user_passes_test
from django.core.mail import EmailMultiAlternatives
class NippoCreateFormView(LoginRequiredMixin,FormView):
template_name = "nippo/nippo-formclass.html"
form_class = NippoModelForm
success_url = reverse_lazy("nippo-list")
def get_form_kwargs(self):
kwgs = super().get_form_kwargs()
kwgs["user"] = self.request.user
return kwgs
def form_valid(self, form):
data = form.cleaned_data
obj = NippoModel(**data)
obj.save()
return super().form_valid(form)
関係するフォーム
forms.py
from django import forms
from .models import NippoModel
class NippoModelForm(forms.ModelForm):
class Meta:
model = NippoModel
exclude = ["user"]
fields = "__all__"
def __init__(self, user=None, *args, **kwargs):
for field in self.base_fields.values():
field.widget.attrs["class"] = "form-control"
self.user = user
super().__init__(*args, **kwargs)
def save(self, commit=True):
nippo_obj = super().save(commit=False)
if self.user:
nippo_obj.user = self.user
if commit:
nippo_obj.save()
return nippo_obj
使用しているモデル
models.py
from django.db import models
from django.utils import timezone
from django.db.models import Q
from django.contrib.auth import get_user, get_user_model
User = get_user_model()
class NippoModel(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
date = models.DateField(verbose_name='日付', blank=True, null=True,default=timezone.now)#年月日、初期値入力日
team = models.CharField(verbose_name='チーム名',max_length=100,default='チーム名')#タイトル
district = models.CharField(verbose_name='地区',max_length=100,default='地区')#内容
content = models.TextField(verbose_name='内容',default='default-content')#内容
timestamp = models.DateTimeField(auto_now_add=True)
objects = NippoModelManager()
わからない点
viwes.pyのget_form_kwargs関数でViweから取得したuserをフォームに渡しその後viwes.pyのform_valid関数で保存するという形になっているはずなのですが、form_valid関数で保存する際にエラーをはいてしまっています。
自分で試したこと
Q:そもそもログインできているのか
出来ています。
下記画像の右上にログイン中のメールアドレスが表示されるようになっています。
表示方法はrequest.userを使用しています。
また編集などを行う際にはDチームの投稿はDチームのマールアドレスでログインしないと編集できないようにしているのですがそちらは問題なく動作しています。
↓一覧表示画面
また編集などを行う際にはDチームの投稿はDチームのマールアドレスでログインしないと編集できないようにしているのですがそちらは問題なく動作しています。
Q:どこから投稿
メールアドレス下記のプラスボタンから投稿できます。
押すとViweのclass NippoCreateFormViewに飛びます
下記の作成画面になります。
登録を押すと一番最初に説明したエラーをはきます。
また自分が投稿した内容については問題なく編集できます
作成画面のhtml
nippo-formclass.html
{% extends 'nippo_base.html' %}
{% block content %}
<div class="container my-3" style="max-width:700px;">
<div class="text-center my-3">
{% if object %}
<h2>編集</h2>
{% else %}
<h2>新しく日程を作成</h2>
{% endif %}
</div>
<form method="POST"> {% csrf_token %}
{{ form.as_p }}
{% if object %}
<button class="btn btn-primary form-control" type="submit">保存</button>
<a href={% url 'nippo-delete' object.pk %} class="btn btn-danger btn-sm">削除</a>
{% else %}
<button class="btn btn-primary form-control" type="submit">登録</button>
{% endif %}
</form>
</div>
{% endblock %}
0