Django评论无法关联所属帖子,关联字段始终为Null求助
Hey there! I’ve run into this exact problem before when building comment systems in Django—let’s break down the most common reasons your comments aren’t linking to posts and how to fix them.
1. Double-Check Your Model Definitions
First, make sure your Comment model’s foreign key to Post is set up correctly. Unless you intentionally allow comments without a parent post, you shouldn’t include null=True (that’s likely why the database accepts empty values for this field).
Example of a correct model setup:
# models.py from django.db import models from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) class Comment(models.Model): content = models.TextField() author = models.ForeignKey(User, on_delete=models.CASCADE) # Critical line: no null=True unless you explicitly need unlinked comments post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments') created_at = models.DateTimeField(auto_now_add=True)
2. Ensure Your View Links the Post to the Comment
This is the most frequent culprit. If you’re using a ModelForm for comments, you’re probably excluding the post field (since users shouldn’t pick which post to comment on)—but that means you have to manually associate the post before saving the comment to the database.
Fix for Function-Based Views
# views.py from django.shortcuts import get_object_or_404, redirect, render from .models import Post, Comment from .forms import CommentForm def add_comment(request, post_id): # Fetch the target post first post = get_object_or_404(Post, pk=post_id) if request.method == 'POST': form = CommentForm(request.POST) if form.is_valid(): # Create comment instance but don't save to DB yet comment = form.save(commit=False) # Manually link the comment to the fetched post comment.post = post # Set the comment author (assuming you're using Django auth) comment.author = request.user comment.save() return redirect('post_detail', post_id=post.id) else: form = CommentForm() return render(request, 'add_comment.html', {'form': form, 'post': post})
Fix for Class-Based Views (e.g., CreateView)
# views.py from django.views.generic.edit import CreateView from django.shortcuts import get_object_or_404 from django.urls import reverse from .models import Comment, Post from .forms import CommentForm class CommentCreateView(CreateView): model = Comment form_class = CommentForm template_name = 'add_comment.html' def form_valid(self, form): # Get the post from URL parameters post = get_object_or_404(Post, pk=self.kwargs['post_id']) # Link the comment to the post form.instance.post = post form.instance.author = self.request.user return super().form_valid(form) def get_success_url(self): return reverse('post_detail', kwargs={'post_id': self.kwargs['post_id']})
3. Verify URL Parameters Are Correct
Make sure your URL pattern is passing the post_id correctly to the view. If the ID is missing or invalid, the view can’t fetch the right post to link:
# urls.py from django.urls import path from . import views urlpatterns = [ # ... other URLs path('post/<int:post_id>/comment/', views.add_comment, name='add_comment'), ]
4. Skip Hidden Form Fields (For Security)
While you could add a hidden post field to your template form, this isn’t secure—users could edit the field value to link comments to unintended posts. Always handle the post association server-side in the view, like the examples above.
Once you adjust these areas, your comments should correctly link to their parent posts in the database. Feel free to tweak any of this to fit your specific setup!
内容的提问来源于stack exchange,提问作者Wavegunner232

