评论帖子是帖子具有的最常见功能,并且在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的数据库浏览器,它将为您提供查看,编辑所有模式的界面。
在实现您的帖子模型之后,现在该在您的帖子上实现评论功能了。
- 在forms.py模块中创建一个表单以获取数据。
- 在views.py模块中创建一个保存或删除注释的函数。
- 从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 。 Django通过此令牌处理表单的加密。
as_p方法用于以段落方式显示表单,以实现更好的可视化。
输出 –
您可以通过HTML中的for循环显示所有注释。 Django提供了新的HTML语言来访问views.py模块中上下文中传递的数据和变量,其中包含for循环,if-else条件等。
您可以在我的github的社交媒体网站项目中查看此功能。
https://github.com/Shikharm16/social-media-site-using-django