>source

댓글 추가를 클릭해도 댓글이 추가되지 않습니다.

views.py

@login_required
def detail_view(request,id):
    data = Post.objects.get(id=id)
    comments = data.comments.filter(active=True)
    new_comment = None
    if request.method == 'POST':
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            new_comment = comment_form.save(commit=False)
            new_comment.post_by = data
            new_comment.save()
    else:
        comment_form = CommentForm()
    context = {'data':data,'comments':comments,'new_comment':new_comment,'comment_form':comment_form}   
    return render(request, 'mains/show_more.html', context )

models.py

class Comment(models.Model):
    post_by = models.ForeignKey(Post, on_delete=models.CASCADE,related_name='comments')
    body = models.TextField()
    active = models.BooleanField(default=False)
    class Meta:
        ordering = ['created_at']
    def __str__(self):
        return self.body

forms.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ('body',)

show_more.html (이것은 내가 주석을 삽입 한 show_more의 템플릿입니다)

       {% for comment in comments %}
        <div class="comments" style="padding: 10px;">
          <p class="font-weight-bold">
            <span class=" text-muted font-weight-normal">
              {{ comment.created_at }}
            </span>
          </p>
          {{ comment.body | linebreaks }}
        </div>
        {% endfor %}
      </div>
    </div>
    <div class="col-md-8 card mb-4  mt-3 ">
      <div class="card-body">
        <h3>Leave a comment</h3>
        <form method="post" style="margin-top: 1.3em;">
          {{ comment_form.as_p }}
          {% csrf_token %}
          <button type="submit" class="btn btn-primary  btn-lg">Submit</button>
        </form>

문제는 견해에 있다고 생각합니다. 제발 도와주세요. 당신의 도움에 정말 감사드립니다.

  • 답변 # 1

    양식을 제출해야하는 작업을 지정해야합니다.

    <form method="post"action="{% url'name-of-detail-view'id=post.pk %}"style="margin-top: 1.3em;">
        {{ comment_form.as_p }}
        {% csrf_token %}
        <button type="submit" class="btn btn-primary  btn-lg">Submit</button>
    </form>
    
    

    어디 'name-of-the-detail-view' 주석을 처리하는 뷰의 이름이어야합니다.

    당신의 뷰에는 몇 가지 안티 패턴이 있습니다. 다음과 같이 개선 할 수 있습니다.

    from django.shortcuts import get_object_or_404
    @login_required
    def detail_view(request, id):
        data = get_object_or_404(Post, pk=id)
        comments = data.comments.filter(active=True)
        if request.method == 'POST':
            comment_form = CommentForm(data=request.POST)
            if comment_form.is_valid():
                comment_form.instance.post_by = data
                comment_form.instance.commented_by = request.user
                # shouldn't the comment be active by default?
                comment_form.instance.active = True  # ??
                new_comment = comment_form.save()
                return redirect(detail_view, pk=pk)
        else:
            comment_form = CommentForm()
        context = {'data':data,'comments':comments,'comment_form':comment_form}   
        return render(request, 'mains/show_more.html', context )
    
    

  • 답변 # 2

    템플릿의 문제를 볼 수 없거나, views.py에서 약간의 수정을 시도해보십시오.

    from django.shortcuts import render, get_object_or_404
    @login_required
    def post_detail(request, year, month, day, post):
        post = get_object_or_404(Post, id=id)
        comments = post.comments.filter(active=True)
        new_comment = None
        if request.method == 'POST':
            comment_form = CommentForm(data=request.POST)
            if comment_form.is_valid():
                new_comment = comment_form.save(commit=False)
                new_comment.post = post
                new_comment.save()
        else:
            comment_form = CommentForm()
        return render(request, 'mains/show_more.html', {'post': post, 
                      'comments':comments, 'new_comment': new_comment,      
                      'comment_form': comment_form})
    
    

관련 자료

  • 이전 목록 파이썬 내부의 사전에서 키 교체
  • 다음 c# - WPF의 패널에 누적 플롯을 어떻게 얻을 수 있습니까?