Django将页面限制为某些用户

时间:2016-03-16 10:01:35

标签: python django

我已经开始尝试在我正在处理的网站上实施用户。 也许这不是一个好方法,因为我是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中实现的,我可以实现的,或者我需要使用&#34; access&#34;来制作我自己的用户表。一个id用于他们可以看到的内容的列,而不是使用用户名?

2 个答案:

答案 0 :(得分:3)

理想情况下,您希望将此类逻辑保留在模板之外。计算视图中的下载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

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

答案 1 :(得分:1)

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