Невозможно добавить экземпляр модели в OneToManyField в django - «Ни у кого нет атрибута»

Я уже видел эту ошибку в другом посте, но все еще в беде.

Я пытаюсь создать социальную сеть, такую ​​​​как 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.


63
3

Ответы:

Во первых должно быть 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 в вашем представлении).