前提・実現したいこと
DjangoGirlsのチュートリアルに従って、ブログの作成をしているのですが、フォームの保存のところでエラーが出てしまい、その解決をしたいと思っております。
発生している問題・エラーメッセージ
Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x1066e8c50>>": "Post.author" must be a "User" instance.
というエラーです。
見た感じだと、Post.author変数がUserインスタンスの型にしてくださいと言っているようです。
該当するソースコード
- view.py
python
1from django.shortcuts import render, get_object_or_404, redirect 2from django.utils import timezone 3from .models import Post 4from .forms import PostForm 5 6 7def post_list(request): 8 posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date') 9 return render(request, 'blog/post_list.html', {'posts' : posts}) 10 11def post_detail(request, pk): 12 post = get_object_or_404(Post, pk=pk) 13 return render(request, 'blog/post_detail.html', {'post': post}) 14 15def post_new(request): 16 if request.method == 'POST': 17 form = PostForm(request.POST) 18 if form.is_valid(): 19 post = form.save(commit=False) 20 post.author = request.user 21 post.save() 22 return redirect(post_detail, pk=post.pk) 23 else: 24 form = PostForm() 25 return render(request, 'blog/post_edit.html', {'form': form})
- models.py
from django.db import models from django.utils import timezone class Post(models.Model): author = models.ForeignKey('auth.User', on_delete=models.CASCADE) title = models.CharField(max_length=200) text = models.TextField() created_date = models.DateTimeField(default=timezone.now) published_date = models.DateTimeField(blank=True, null=True) def publish(self): self.published_date = timezone.now() self.save() def __str__(self): return self.title
チュートリアルのソースコードから特に変更点はなく、様々なブログでもこの書き方で問題なく動いてるらしいので、なぜ型が違うことでエラーが出ているのかがわからない状況です。
ご存知の方がいらっしゃいましたら、ご教授のほどよろしくお願いいたします。
- 開発環境
python3.5(Anaconda)
Django==2.1.2
メモ
from django.contrib.auth.models import User post.author = User.objects.create_user("hogehoge")
とかで無理矢理インスタンスを作れば大丈夫なのはわかりました。
回答1件
あなたの回答
tips
プレビュー