Почему внешний ключ не сохраняется в ModelForm (1048, «Столбец post_id» не может быть пустым ») - PullRequest
1 голос
/ 18 марта 2011

Это должно быть простой проблемой, но это уже давило на меня.

Я хочу сохранить форму модели, но продолжаю получать вышеуказанную ошибку.

class Favorite(models.Model):
    post=models.ForeignKey(Post)
      user=models.ForeignKey(User)  
    note=models.TextField(max_length=1000, blank=True)


def listing(request, pid):
    post=get_object_or_404(Post,pk=pid)
    favform=FavoriteForm()
     try:
        ratings=post.post_rating_set.all()
        score=ratings.aggregate(mark=Avg('rating'))
         score=int(score.get('mark',0))-1 
    except AttributeError:
            ratings=''
            score=1000 
    if request.method=="POST" and request.POST.get('save_it',''):
        user=User.objects.get(pk=request.user.id)
        favorite=FavoriteForm(request.POST)
        if favorite.is_valid:

            favorite.save(commit=False)
            favorite.user=user
            favorite.post=post

            favorite.save()

Моя форма проверена, я проверил как пользователя, так и публикацию, и они оба содержат предполагаемые наборы запросов.Сначала я старался не сохранять любимую форму, но и это не удалось.м2м здесь не подходит.

Это ошибка установки mysql?

Ответы [ 2 ]

6 голосов
/ 18 марта 2011

Вы используете commit=False неправильно. save() возвращает экземпляр, и вы просто дважды вызываете save для формы.

Сделайте это вместо:

        favorite = favorite.save(commit=False) 
        # now, favorite is an instance returned by save.
        favorite.user=user
        favorite.post=post
        favorite.save()

Я бы лично назвал форму любимой формы, чтобы различать также экземпляр и форму.

1 голос
/ 18 марта 2011

Вы можете поместить декоратор перед объявлением метода.

@transaction.commit_on_success
def listing(request, pid):
    post=get_object_or_404(Post,pk=pid)
    ...

и удалить эту строку:

favorite.save(commit=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...