Search code examples
pythondjangoforeign-keys

How can I connect the user to a post he created in Django


I am starting with Django, and I have a question about the connection between a post and the user who created it. For now, I managed to create the link, however, whenever I create a new post, the user id is always the default one, thus one. I want to make it in a way that the user id is the id of the person creating the post, and for some reason, it never works. The other option I tried is to put "user" into the form but the problem is that then the user can choose which user he is, which is risky. So is there any way to make it automatic? That when the post is created, the right user id is directly connected to it? Thank you for any help!!

model.py

"""

class Post(models.Model):      
    user = models.ForeignKey(User,on_delete=models.CASCADE, default=1)      
    image = models.ImageField(default="man.jpg")      
    titre = models.CharField(max_length=50)      
    slug = models.SlugField(max_length=100)      
    date_publication = models.DateTimeField(auto_now_add=True)

"""

view.py

"""

@login_required  
    def post_create(request):      
    if request.method == "POST":          
        post_form = PostForm(request.POST)          
        if post_form.is_valid():              
            post_form.save()              
            messages.success(request, 'Your post was successfully created!')              
            return redirect('seed:view_seed')          

        else:              
            messages.error(request, 'Please correct the error below.') 
           
    else:          
        post_form = PostForm(request.POST)    

    return render(request, "post/create.html", context={"post_form": post_form})  

"""

forms.py

"""

class PostForm(ModelForm):
     class Meta:          
         model = Post          
         fields = ["user", "image", "titre", "slug"]

"""


Solution

  • You remove the user field from the fields in the form:

    class PostForm(ModelForm):
        class Meta:
            model = Post
            # no user ↓
            fields = ['image', 'titre', 'slug']

    and in the view you add the logged in user to the instance wrapped in the form:

    @login_required
    def post_create(request):
        if request.method == 'POST':
            post_form = PostForm(request.POST)
            if post_form.is_valid():
                # add user to the instance ↓
                post_form.instance.user = request.user
                post_form.save()
                messages.success(request, 'Your post was successfully created!')
                return redirect('seed:view_seed')
            else:
                messages.error(request, 'Please correct the error below.')
        else:
            post_form = PostForm()
        return render(request, "post/create.html", context={"post_form": post_form})

    Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.