65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Django 处理用户提交的内容

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2019年8月21日

CPOL

3分钟阅读

viewsIcon

5941

使用 Django 登录来接受用户“喜欢”和内容提交。

引言

我参与的其中一个开发社区有一个商店,可以帮助人们下载项目,但该商店没有评论或投票功能。为了找到好的项目,我们必须自己下载并测试每个项目。为了帮助社区分享测试和反馈,我的朋友和我用 Django 在一天内建立了一个简单的评论网站。

您可以在下面的实时网站上查看,创建一个帐户,练习“喜欢”条目,并查看内容上传功能。

虽然该网站仍需要完善,但我很高兴能够使用 Django 快速搭建一些东西,并让人们在我想到构建该网站的第二天上传他们自己的内容。

背景

该网站界面很简单,包含项目图标列表、评论标题、评论摘要和评论的“赞”按钮。

该项目的核心部分是创建用户登录来实现以下目标:

  • 仅允许登录用户创建内容和投票
  • 在评论中列出用户名
  • 需要用户登录才能下载某些需要用户同意的资产,例如示例代码或供应商的特殊技术信息

注册通过一个简单的 HTML 表单处理。

登录后,您可以投票并提交内容。

Using the Code

完整的 views.py 文件用于创建帐户、登录和注销,在此处:

帐户创建

创建帐户的部分是:

user = User.objects.create_user(request.POST['username'], password=request.POST['password1'],
                    email=request.POST['email'])
auth.login(request, user)

内容创建

内容创建由另一个 views.py 文件处理,该文件可在以下位置找到:

我遇到了检测空白图像上传字段的困难。 我处理这个问题的方法的代码是:

            # handle condition when there is no icon uploaded
            if not request.FILES.get('icon', False):
                plugin.icon = 'theta_logo.png'
            else:
                plugin.icon = request.FILES['icon']
            # handle condition when no image is uploaded
            if not request.FILES.get('image', False):
                plugin.image = 'invisible.png'
            else:
                plugin.image = request.FILES['image']

即使在 Internet 和 Stackoverflow 上搜索之后,我仍然无法在模型中设置默认图像。 我最终使用了以下过程:

  1. 将默认徽标和一个不可见的 1 像素图像保存到 media 文件夹中
  2. 使用 request.FILES.get('name_from_form', False) 检查图像是否为空
  3. 如果图像为空,则将其设置为默认图像

plugin.imageplugin.icon 指的是 models.py 中定义的字段。

    image = models.ImageField(upload_to='images/')
    icon = models.ImageField(upload_to='images/')

完整的 models.py 位于:

按最新帖子优先排序

最新的帖子位于列表的顶部。使用 order_by('-pk') 实现起来非常简单。关键部分是主键“pk”之前的减号。减号反转顺序。

def home(request):
    plugins = ThetaPlugins.objects.order_by('-pk')
    return render(request, 'theta_plugins/home.html', {'plugins': plugins})

保护内容

如果将帐户创建与服务条款或许可协议的同意相关联,则限制对诸如需要协议的技术文档之类的内容的访问很容易。在 views.py 文件中,您可以使用 @login_required 装饰器来限制内容或操作。这就是您需要做的全部。

    from django.shortcuts import render
    from django.contrib.auth.decorators import login_required

    def home(request):
        return render(request, 'theta_plugins/home.html')

    @login_required
    def create(request):
        return render(request, 'theta_plugins/create.html')

关注点

该项目最有趣的部分是允许人们创建自己的内容,并通过“赞”等功能与网站进行互动。Django 使这一切变得非常快速和容易。如果网页设计师主要使用 Bootstrap、CSS、HTML 等工具,那么起初可能觉得创建一个完整的网站来处理用户生成的内容和投票很困难。但是,一旦你开始,一切都会水到渠成,你就能完成你的项目。Django 是一个旧的 Web 框架,但这意味着有很多免费的教程,而且你遇到的几乎每一个问题都已经被人解决了。

后续步骤

文本输入是应用程序中最薄弱的部分。我正在考虑基于这个简单的例子在 Vue 中实现一个简单的 Markdown 编辑器:

历史

  • 2019年8月21日:初始版本
© . All rights reserved.