如何在Django中创建我的评论表格以开始工作

问题描述

我有一个博客应用程序,我正在尝试在该应用程序上添加评论功能,但显示不正确,该评论表单假定显示名称,电子邮件和正文,但未显示... 这是我的网络应用程序中的图片

enter image description here

下面是我的view.py代码

from django.contrib import messages
from django.contrib.auth.mixins import (LoginRequiredMixin,UserPassesTestMixin)
from django.contrib.auth.models import User
from django.urls import reverse_lazy,reverse
from django.http import HttpResponseRedirect,Http404
from django.shortcuts import render,get_object_or_404,redirect
from django.views.generic import (ListView,DetailView,CreateView,UpdateView,DeleteView)

from .models import Post
from django.core.files.storage import FileSystemStorage
from .forms import PostForm,CommentForm
from . import models



def home(request):
    context = {
        'posts': Post.objects.all()
    }
    return render(request,'blog/home.html',context)

def upload(request):
    if request.method == 'POST':
        form = PostForm(request.POST,request.FILES)
        if form.is_valid():
            form.save()
            return redirect('post_detail')
    else:
        form = PostForm()
    return render(request,'blog/post_detail.html',{'form': form })

class PostListView(ListView):
    model = Post
    template_name = 'blog/home.html'
    context_object_name = 'posts'
    ordering = ['-date_posted']
    paginate_by = 6

class UserPostListView(ListView):
    model = Post
    template_name = 'blog/user_posts.html'
    context_object_name = 'posts'
    paginate_by = 6

    def get_queryset(self):
        user = get_object_or_404(User,username=self.kwargs.get('username'))
        return Post.objects.filter(author=user).order_by('-date_posted')



class PostDetailView(DetailView):
    model = Post

def post_detail(request,slug):
    template_name = 'post_detail.html'
    post = get_object_or_404(Post,slug=slug)
    comments = post.comments.filter(active=True)
    new_comment = None
    # Comment posted
    if request.method == 'POST':
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():

            # Create Comment object but don't save to database yet
            new_comment = comment_form.save(commit=False)
            # Assign the current post to the comment
            new_comment.post = post
            # Save the comment to the database
            new_comment.save()
    else:
        comment_form = CommentForm()

    return render(request,template_name,{'post': post,'comments': comments,'new_comment': new_comment,'comment_form': comment_form})

下面的models.py代码

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
from groups.models import Group
from PIL import Image
import misaka

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    message = models.TextField()
    message_html = models.TextField(editable=False)
    group = models.ForeignKey(Group,related_name="posts",null=True,blank=True,on_delete=models.CASCADE)
    image = models.ImageField(upload_to='media/',default='/media/default-user.jpg')


    def __str__(self):
        return self.title

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


    def save(self,*args,**kwargs):
        self.message_html = misaka.html(self.message)
        super().save(*args,**kwargs)

        img = Image.open(self.image.path)
        if img.height > 300 or img.width > 300:
            output_size = (500,500)
            img.thumbnail(output_size)
            img.save(self.image.path)



class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name='comments')
    name = models.CharField(max_length=80)
    email = models.EmailField()
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)

    class Meta:
        ordering = ['created_on']

    def __str__(self):
        return 'Comment {} by {}'.format(self.body,self.name)

Forms.py代码也

from django import forms
from . import models
from .models import Post,Comment


class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ("title","group","image")


    def __init__(self,**kwargs):
        user = kwargs.pop("user",None)
        super().__init__(*args,**kwargs)
        if user is not None:
            self.fields["group"].queryset = (
                models.Group.objects.filter(
                    pk__in=user.groups.values_list("group__pk")
                )
            )

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

最后是post_detail.html

{% extends "blog/base.html" %}
{% block content %}

        <article class="media content-section">
              <img class="rounded-circle article-img" src="{{ object.author.profile.image.url }}">
              <div class="media-body">
                <div class="article-metadata">
                  <a class="mr-2" href="{% url 'posts:user-posts' object.author.username %}">{{ object.author }}</a>
                  <small class="text-muted">{{ object.date_posted|date:"F d,Y" }}</small>
                    {% if object.author == user %}
                        <div>
                            <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'posts:post-update' object.id %}">Update</a>
                            <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'posts:post-delete' object.id %}">Delete</a>
                        </div>
                    {% endif %}
                </div>
                <h2 class="article-title">{{ object.title }}</h2>
                {% if object.image %}
                    <img src="{{ object.image.url }}" class="card-img-top" />
                {% endif %}
                <p class="article-content">{{ object.content }}</p>

              </div>
        </article>

        <div class="container">
          <div class="row">
            <div class="col-md-8 card mb-4  mt-3 left  top">
              <div class="card-body">
                <h1>{% block title %} {{ post.title }} {% endblock title %}</h1>
                <p class=" text-muted">{{ post.author }} | {{ post.created_on }}</p>
                <p class="card-text ">{{ post.content | safe }}</p>
              </div>
            </div>

            <div class="col-md-8 card mb-4  mt-3 ">
              <div class="card-body">
                <!-- comments -->
                <h2>{{ comments.count }} comments</h2>

                {% for comment in comments %}
                <div class="comments" style="padding: 10px;">
                  <p class="font-weight-bold">
                    {{ comment.name }}
                    <span class=" text-muted font-weight-normal">
                      {{ comment.created_on }}
                    </span>
                  </p>
                  {{ comment.body | linebreaks }}
                </div>
                {% endfor %}
              </div>
            </div>
            <div class="col-md-8 card mb-4  mt-3 ">
              <div class="card-body">
                {% if new_comment %}
                <div class="alert alert-success" role="alert">
                  Your comment is awaiting moderation
                </div>
                {% else %}
                <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>
                {% endif %}
              </div>
            </div>
          </div>
        </div>


{% endblock %}

这是post_detail.html代码

{% extends "blog/base.html" %}
{% block content %}

        <article class="media content-section">
              <img class="rounded-circle article-img" src="{{ object.author.profile.image.url }}">
              <div class="media-body">
                <div class="article-metadata">
                  <a class="mr-2" href="{% url 'user-posts' object.author.username %}">{{ object.author }}</a>
                  <small class="text-muted">{{ object.date_posted|date:"F d,Y" }}</small>
                    {% if object.author == user %}
                        <div>
                            <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'post-update' object.id %}">Update</a>
                            <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'post-delete' object.id %}">Delete</a>
                        </div>
                    {% endif %}
                </div>
                <h2 class="article-title">{{ object.title }}</h2>
                {% if object.image %}
                    <img src="{{ object.image.url }}" class="card-img-top" />
                {% endif %}
                <p class="article-content">{{ object.content }}</p>

              </div>
        </article>

        <div class="container">
          <div class="row">
            <div class="col-md-8 card mb-4  mt-3 left  top">
              <div class="card-body">
                <h1>{% block title %} {{ post.title }} {% endblock title %}</h1>
                <p class=" text-muted">{{ post.author }} | {{ post.created_on }}</p>
                <p class="card-text ">{{ post.content | safe }}</p>
              </div>
            </div>

            <div class="col-md-8 card mb-4  mt-3 ">
              <div class="card-body">
                <!-- comments -->
                <h2>{{ comments.count }} comments</h2>

                {% for comment in comments %}
                <div class="comments" style="padding: 10px;">
                  <p class="font-weight-bold">
                    {{ comment.name }}
                    <span class=" text-muted font-weight-normal">
                      {{ comment.created_on }}
                    </span>
                  </p>
                  {{ comment.body | linebreaks }}
                </div>
                {% endfor %}
              </div>
            </div>
            <div class="col-md-8 card mb-4  mt-3 ">
              <div class="card-body">
                {% if new_comment %}
                <div class="alert alert-success" role="alert">
                  Your comment is awaiting moderation
                </div>
                {% else %}
                <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>
                {% endif %}
              </div>
            </div>
          </div>
        </div>


{% endblock %}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)