Я уже видел эту ошибку в другом посте, но все еще в беде.
Я пытаюсь создать социальную сеть, такую как instagram, где пользователи смогут публиковать сообщения (фотографии). У меня есть класс User, который наследуется от AbstractUser, и получил поле сообщений OneToMany: каждый пользователь может публиковать много сообщений.
После успешного извлечения моей фотографии из: PostForm(request.POST, request.FILES) и ее правильного сохранения я не могу добавить эту фотографию в публикации/сообщения текущего пользователя и получаю сообщение об ошибке:
'NoneType' object has no attribute 'add'
def blog_and_photo_upload(request):
form = PostForm()
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
if form.is_valid():
user = get_user(request) # user instance is correct with good pk
post = Post.objects.create(image=form.cleaned_data['image']) # post instance looks correct also
post.save()
user.save()
user.posts.add(post) # row doesnt work
redirect('home')
return render(request, 'base/upload_post.html', {'form': form})
модели.py
class Post(models.Model):
...
image = ResizedImageField(size=[300, 300], blank=True, upload_to='posts')
class User(AbstractUser):
...
posts = models.ForeignKey(Post, on_delete=models.Cascade, null=True)
🤔 А знаете ли вы, что...
Python используется в разработке мобильных приложений с использованием Kivy.
Во первых должно быть return redirect(...)
не только redirect()
а во вторых попробуйте использовать следующий вид:
def blog_and_photo_upload(request):
form = PostForm()
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
if form.is_valid():
user = get_user(request) # user instance is correct with good pk
post = Post.objects.create(image=form.cleaned_data['image']) # post instance looks correct also
post.save()
user.posts.add(post) # add post to user's posts field
user.save()
return redirect('home')
return render(request, 'base/upload_post.html', {'form': form})
Вам нужно связать первый пост с моделью пользователя, например добавить ForeignKey или ManyToManyFields, чтобы связать их.
posts = models.ForeignKey(User)
тогда вы сможете называть это так, как вы это делали
user.posts # this won't return None
Проверьте это много ко многим полевым документам: https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_many/
Вы можете просто обновить форму следующим образом:
post = Post.objects.create(image=form.cleaned_data['image']) # post instance looks correct also
post.save()
user.posts = post
user.save()
return redirect('home')
Но, я думаю, дизайн модели неправильный, отношение User
к Post
должно быть таким:
Class User(...):
posts = models.ManyToManyField(Post)
Таким образом, ваша первоначальная реализация должна работать. (Возможно, вам не нужно user.save()
call в вашем представлении).