📜  Django项目创建一个注释系统

📅  最后修改于: 2021-05-20 05:48:07             🧑  作者: Mango

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

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

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

    通过以下方式启动一个新的django项目:

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

    创建一个新的应用程序,如下所示:

    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用户作为参数。归档on_delete时要注意如果删除用户可能导致帖子发生的异常情况。建模时,级联字段会在删除用户时同时删除所有与用户相关的帖子数据。

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

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

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

    python manage.py makemigrations
    python manage.py migrate

    这将使post表进入您的数据库。我正在使用django默认数据库。

  • 为了可视化您的表和数据库,我建议您下载sqlite的数据库浏览器,它将为您提供查看,编辑所有模式的界面。

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

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

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

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

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

    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()
    

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

    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方法刮擦帖子的内容,然后按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