📜  Django项目创建一个评论系统

📅  最后修改于: 2021-10-28 02:45:58             🧑  作者: Mango

评论帖子是帖子最常见的功能,在 Django 中实现比在其他框架中更容易。要实现此功能,需要遵循一些步骤,但首先让我们从创建一个新项目开始。

如何在 Django 中创建评论功能?

  • 打开命令提示符并运行以下命令。

    启动一个新的 Django 项目:

    django-admin startproject my_project
  • 执行此命令后,您将看到 django 为您创建的以下文件和文件夹。要查看此文件夹,您可以在命令提示符下使用 tree 命令或在 ide 中打开该文件夹,在我的情况下,我使用了sublime text editor

    创建一个新的应用程序:

    python manage.py startapp portfolio_app
  • Django 会自动创建文件,这样你就可以专注于你的任务,而不必担心其他事情,比如创建文件和构建文件。

  • 在本文中,我们将制作一个帖子模型来发布图片:

    帖子由以下字段组成:

    1.Image
    2.Caption or description
    3.Date posted
    4.Author of the image.
  • 首先,在models.py 中导入所需的模块:

    from django.db import models
    from django.utils import timezone
    from django.contrib.auth.models import User

    现在,继续使用 models.py 模块,添加以下代码段。

    class Post(models.Model):
        image = models.ImageField(
            default ="default_foo.png", upload_to ="post_picture")
        caption = models.TextField()
        date_posted = models.DateTimeField(default = timezone.now)
        author = models.ForeignKey(User, on_delete = models.CASCADE)
      
        def __str__(self):
            return f'{self.author.username}\'s Post- {self.title}'
      
        def save(self, *args, **kwargs):
            super().save(*args, **kwargs)
            img = Image.open(self.image.path)
            if img.height > 400 or img.width > 400:
                output_size = (300, 300)
                img.thumbnail(output_size)
                img.save(self.image.path)
    
  • 模型的名称是后期模型(它可以是您的任何选择)。让我们了解使用的每个字段的详细信息。

    图像字段:此字段允许将图像存储在数据库中。默认值包括我命名为 default_foo.png 的默认图像。当没有可用的图片或用户发布的图片时,它会自动保存。此图像位于 my_project 目录中名为 Media 的文件夹中。如果用户上传图片,它会上传到名为 post_picture 的目录中,由属性 upload_to 设置。

    标题:此字段描述了图像字段的标题为标题的图像的描述。

    发布日期:此字段考虑了上传图像的时间和日期。默认值 timezone.now 保存创建此帖子的时间。如果帖子在发布后更新,则时间/日期不会更改。

    作者:此属性考虑了发布此帖子的用户。它以 django user 作为参数来执行此操作。 on_delete 文件负责处理用户被删除时帖子可能发生的异常情况。模型,级联字段在用户被删除时同时删除所有与用户相关的帖子数据。

    __str__ 方法:这些方法在Python中也称为魔术方法。它以自我为属性。此方法将标题信息显示给后端的 django 管理员。

    save 方法:覆盖此方法以使用用户自定义值保存帖子。如果我们想在我们的数据库中保存特定大小的图像,则使用 save 方法来执行此操作。为此,您必须在 models.py 模块中导入 PIL 以读取图像。通过 open 方法将图像打开到变量中,并将其存储在数据库中的特定输出大小中,以避免在数据库中存储大图像。

    成功创建后期模型后,在终端上运行以下命令,并将更改保存在数据库中。

    python manage.py makemigrations
    python manage.py migrate

    这将使您的数据库中的帖子表。我正在使用 django 默认数据库。

  • 为了可视化您的表和数据库,我建议您下载用于 sqlite 的 DB Browser ,它将为您提供一个界面来查看、编辑您的所有架构。

    在实现您的帖子模型之后,现在是时候在您的帖子上实现评论功能了。

    1. 在 forms.py 模块中创建一个表单以获取数据。
    2. 在 views.py 模块中创建一个保存或删除注释的函数。
    3. 从 html 文件中获取评论。

    models.py 中导入必要的模块和包

    from django.db import models
    from django.contrib.auth.models import User
    

    从模型开始,在您的应用程序的models.py模块中创建模型注释。

    class Comment(models.Model):
      post = models.ForeignKey(Post, on_delete = models.CASCADE, related_name ='comments')
      user = models.ForeignKey(User, on_delete = models.CASCADE)
      content = models.TextField()
    

    这里,foriegnkey 描述了帖子和用户的多对一关系。级联对于不相关的数据非常有用,例如,如果帖子或帖子的作者被删除,那么他们就不需要保留该用户的数据。级联字段有助于同时删除这些对象及其值。

    Note: Do not forget to run migration commands( explained Above in the post) 
    to save the changes in database.
  • forms.py 模块中制作一个表单来收集评论的内容。如果您的 django 应用程序中没有 form.py,则创建一个 .

    Django 有内置的表单来创建它并直接访问它,而无需从头开始编写新的表单。

    from django import forms
    from .models import Comment
      
    class CommentForm(forms.ModelForm):
        content = forms.CharField(label ="", widget = forms.Textarea(
        attrs ={
            'class':'form-control',
            'placeholder':'Comment here !',
            'rows':4,
            'cols':50
        }))
        class Meta:
            model = Comment
            fields =['content']
    
  • 移动到views.py模块,处理和保存来自 html 表单的数据,以下代码继续。我正在帖子详细信息视图中实现评论功能,您可以在任何地方使用它,方法是相同的。

    from .forms import CommentForm
      
    def post_detailview(request, id):
        
      if request.method == 'POST':
        cf = CommentForm(request.POST or None)
        if cf.is_valid():
          content = request.POST.get('content')
          comment = Comment.objects.create(post = post, user = request.user, content = content)
          comment.save()
          return redirect(post.get_absolute_url())
        else:
          cf = CommentForm()
            
        context ={
          'comment_form':cf,
          }
        return render(request, 'socio / post_detail.html', context)
    

    从 forms.py 模块导入CommentForm ,创建一个 commentform 对象并检查它是否有效。 Django 提供了内置功能来通过is_valid方法检查表单凭据和格式。

  • 通过 get 方法抓取 post 的内容并通过 create 方法创建新评论,然后通过 Save 方法将创建新帖子时创建的对象的数据保存在数据库中。

    cf 对象通过上下文字典传递到 html 中以访问 HTML 中的所有注释。

    最后,为了从 html 表单中获取数据,表单标签与用作 post 的方法一起使用,因为我们必须将数据发送到服务器。以下代码段显示了如何从 html 中的表单中获取值。

    {% load crispy_forms_tags %}
    
      
      
      
      
      
        {% csrf_token %}     {{comment_form.as_p}}   

    此处, Csrf_token用于安全目的。 Django 通过这个令牌来处理表单的加密。

    as_p方法用于以段落方式显示表单以获得更好的可视化。

输出 –

评论框

您可以通过 HTML 中的 for 循环显示所有注释。 Django 提供了新的 HTML 语言来访问在 views.py 模块的上下文中传递的数据和变量,其中包含 for 循环、if-else 条件等。

您可以在我的 github 中的社交媒体网站项目中查看此功能。

https://github.com/Shikharm16/social-media-site-using-django