yierstem
yierstem

Reputation: 2067

ModelForm with user being request.user

I'm trying to make a form where user can submit a post/article.

I have this model:

class Post(models.Model):
    title = models.CharField(max_length=150)
    content = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

This form:

class PostForm(forms.ModelForm):
    title = forms.CharField(required=True)
    content = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = Post
        fields = ['title', 'content']

And this view:

class PostCreateView(FormView):
    form_class = PostForm
    template_name = 'template/create_post.html'
    success_url = reverse_lazy('index')

    def form_valid(self, form):
        response = super(PostCreateView, self).form_valid(form)
        form.user = self.request.user
        form.save()
        return response

I've set the user, but I'm still getting

IntegrityError at /new-post/ NOT NULL constraint failed: cyth_post.user_id

Here's the full traceback call: http://dpaste.com/0PJSTY2

What am I doing wrong here?

Thanks in advance for answers!

Upvotes: 0

Views: 1134

Answers (1)

user8060120
user8060120

Reputation:

You need set form.instance user and then run super

def form_valid(self, form):
    form.instance.user = self.request.user
    return super(PostCreateView, self).form_valid(form)

Upvotes: 3

Related Questions