简体   繁体   中英

IntegrityError at /create/ NOT NULL constraint failed: main_post.author_id

When i try to create an new post with http://localhost:8000/create/, i get this error. I couldn't find the solution thought they seem similar. I follows some blog tutorial

I can't paste the settings.py here because there to much code in the post but i think the settings.py is fine btw

My models.py (* i deleted some code maynot involve)

User = get_user_model()

class Author(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_picture = models.ImageField()

    def __str__(self):
        return  self.user.username

class Post(models.Model):
    title = models.CharField(max_length=100)
    overview = models.TextField()
    detail = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    content = RichTextUploadingField(config_name='post_ckeditor')
    comment_count = models.IntegerField(default=0)
    view_count = models.IntegerField(default=0)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    thumbnail = models.ImageField()
    categories = models.ManyToManyField(Category)
    featured = models.BooleanField()
    previous_post = models.ForeignKey('self', related_name='previous', on_delete=models.SET_NULL, blank = True, null = True)
    next_post = models.ForeignKey('self', related_name='next', on_delete=models.SET_NULL, blank = True, null = True)

My views.py

def get_author(user):
    qs = Author.objects.filter(user=user)
    if qs.exists():
        return qs[0]
    return None
    pass

def post_create(request):
    form = PostForm(request.POST or None, request.FILES or None)
    author= get_author(request.user)
    if request.method == 'POST':
        if form.is_valid():
            form.instance.author = author
            form.save()
            return redirect(reverse('post-detail', kwargs={
                'id': form.instance.id
                }))
    context = {
        'form': form
    }
    return render(request, 'post_create.html', context)
    pass

My forms.py

from django import forms
from .models import Post, Comment


class PostForm(forms.ModelForm):
    content = forms.CharField
    class Meta:
        model = Post
        fields = ('title', 'overview', 'content', 'thumbnail', 'categories', 'featured', 'previous_post', 'next_post')

class CommentForm(forms.ModelForm):
    content = forms.CharField(widget=forms.Textarea(attrs={
        'class':'form-control',
        'placeholder':'Type your comment',
        'id':'usercomment',
        'rows':4
    }))
    class Meta:
        model = Comment
        fields = ('content', )

Please help !

Whenever there is a change in model fields or new model added or removed, you should migrate. And pass a default object to foreign key if not null.

If you are trying to save request.user in the author field you don't need to write the extra methods just do like this.

if request.method == 'POST':
    if form.is_valid():
       post =form.save(commit=False)
       post.author = request.user
       post.save()
       return redirect(reverse('post-detail', kwargs={'id': post.id }))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM