【问题标题】:Django restrict pages to certain usersDjango 将页面限制为特定用户
【发布时间】:2016-07-02 03:14:05
【问题描述】:

我已经开始尝试在我正在开发的网站上实现用户。 也许这不是一个好方法,因为我是 django 新手;到目前为止,我所做的是一个简单的模板检查,可以为不同的人提供不同的链接:

{% extends 'base.htm' %}
{% block content %}
    {% if user.username == 'user1' %}
    <p>User 1 Downloads</p>
    {% elif user.username == 'user2' %}
    <p>User 2 Downloads</p>
    {% else %}
    <p>There are no Downloads for this User</p>
    {% endif %}
{% endblock %}

这是我公司的一个新网站,我预计最多可能有 20 个用户,虽然我可以通过他们,但可能有更好的方法来做到这一点。此外,我希望能够拥有例如:user1 到 user5 可以访问下载 1,user6 到 user10 可以访问下载 2,等等。这是我可以在 django 中实现的东西,还是我需要创建自己的 users 表,其中包含一个带有 id 的“访问”列,用于他们可以看到的内容,而不是使用用户名?

【问题讨论】:

  • 在我们的项目中,我们使用django.contrib.auth 并将用户分配到组以过滤允许他们查看的内容。
  • 将下载的内容放在一个表中,并在该表中添加一个“用户”字段,这样您就可以使用 user == logged_user 获取所有下载
  • @ChuckLoganLim 我读过关于群组的文章,但我很难找到如何创建和使用群组。
  • @MarcoAcierno 您是指下载链接还是实际下载?我可以查看它;此时我的数据库纯粹是 django 默认表。

标签: python django


【解决方案1】:

如果用户更改姓名(即结婚/离婚/时髦),您的方法将很快失败,最好在下载模型和用户之间提供多对多关系,然后您可以在模板中遍历这些内容以检索特定用户可用的所有下载。

【讨论】:

    【解决方案2】:

    理想情况下,您希望将这种逻辑排除在模板之外。计算视图中的下载 url,并将其传递给模板。然后您的模板将简化为:

    {% if download_url %}<a href="{{ download_url }}">Download</a>{% else %}No downloads{% endif %}
    

    在您看来,您可以从 if/elif 语句开始确定下载 url。

    def get_download_url(self):
        if user.username == 'user1':
            download_url = '/downloads/user1/'
        elif user.username == 'user2':
            download_url = '/downloads/user2/'
        else:
            download_url = None
    

    如果这变得复杂,您可以使用字典或数据库表,而不必更新模板。

    def get_download_url(user):
        download_urls = {
            'user1': '/downloads/user1/',
            'user2': '/downloads/user2/',
        }
        return download_urls.get(user.username)
    

    最终,您可能希望将信息存储在数据库中。请注意,您不需要自定义用户。您只需要具有链接到用户的外键/一对一/多对多字段的模型。

    class Download(models.Model):
        user = models.OneToOneField('auth.User')  # one to one field limits to one download url per user
        download_url = models.CharField()
    

    然后在视图中:

    def get_download_url(user):
        try:
            download = Download.objects.get(user=user)
            return download.download_url
        except Download.DoesNotExist:
            return None
    

    我确信所有这些 sn-ps 都可以改进或调整以更好地适应您的使用。我的主要观点是,如果您使用 Python 而不是 Django 模板语言,您会发现更容易获得正确的逻辑。

    【讨论】:

    • 您能详细说明我将如何计算下载网址吗?这似乎是一种更好的方法,并且可以保持我的 html 很小。
    • 我添加了一些建议来帮助您入门。
    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2018-08-01
    • 2010-11-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    相关资源
    最近更新 更多