ht18a111
@ht18a111 (芳本 悠太)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Django フォームを使った認証機能連携

解決したいこと

認証機能と投稿機能の連携

投稿する機能の連携中にエラーが発生しました。
解決方法を教えて下さい。

発生している問題・エラー

エラー
スクリーンショット 2022-12-12 235030.png
エラーの詳細位置
スクリーンショット 2022-12-12 235434.png

該当するソースコード

下記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チームのマールアドレスでログインしないと編集できないようにしているのですがそちらは問題なく動作しています。
↓一覧表示画面
スクリーンショット 2022-12-13 002355.png

また編集などを行う際にはDチームの投稿はDチームのマールアドレスでログインしないと編集できないようにしているのですがそちらは問題なく動作しています。

Q:どこから投稿
メールアドレス下記のプラスボタンから投稿できます。
押すとViweのclass NippoCreateFormViewに飛びます
下記の作成画面になります。
登録を押すと一番最初に説明したエラーをはきます。
また自分が投稿した内容については問題なく編集できます
スクリーンショット 2022-12-13 003701.png

作成画面の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

1Answer

NippoModelForm の exclude = ["user"] で除外しているのは原因ではありませんか?

0Like

Your answer might help someone💌