Python Django将页面限制为某些用户

Python Django将页面限制为某些用户,python,django,Python,Django,我已经开始尝试在我正在工作的网站上实现用户。 也许这不是一个好方法,因为我是django的新手;到目前为止,我只做了一个简单的模板检查,为不同的人提供不同的链接: {% extends 'base.htm' %} {% block content %} {% if user.username == 'user1' %} <p>User 1 Downloads</p> {% elif user.username == 'user2' %} &

我已经开始尝试在我正在工作的网站上实现用户。 也许这不是一个好方法,因为我是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 %}
{%extends'base.htm%}
{%block content%}
{%if user.username=='user1'%}
用户1下载

{%elif user.username=='user2%} 用户2下载

{%else%} 此用户没有下载

{%endif%} {%endblock%}

这是我公司的一个新网站,我预计最多可能有20个用户,而如果我能通过他们/案例,可能有更好的方法来做到这一点。此外,我希望能够有例如:user1到user5有权下载1,user6到user10有权下载2,等等。这是django中已经考虑到的,我可以实现的,还是我需要用一个“access”列来创建我自己的users表,该列的id用于他们可以看到的内容,而不是使用用户名?

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

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

{% if download_url %}<a href="{{ download_url }}">Download</a>{% else %}No downloads{% endif %}
如果这变得复杂,您可以使用字典或数据库表,而不必更新模板

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模板语言,您会发现更容易获得正确的逻辑。

在我们的项目中,我们使用了
Django.contrib.auth
,并将用户分配到组中,以过滤允许他们查看的内容。将下载内容放在一个表中,并在此表中添加一个“user”字段,这样您就可以使用user==logged获取所有下载_user@ChuckLoganLim我读过关于群组的文章,但是我很难找到如何制作和使用群组。@Marcacierno你是指下载链接还是实际下载?我可以看着它;此时,我的数据库纯粹是django默认表。您是否可以详细说明如何计算下载url?这似乎是一个更好的方法,可以使我的html保持较小的规模。我已经添加了一些建议来帮助您开始。
def get_download_url(user):
    try:
        download = Download.objects.get(user=user)
        return download.download_url
    except Download.DoesNotExist:
        return None