Django 将页面限制为特定用户
Posted
技术标签:
【中文标题】Django 将页面限制为特定用户【英文标题】:Django restrict pages to certain users 【发布时间】: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 默认表。
【参考方案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 很小。 我添加了一些建议来帮助您入门。以上是关于Django 将页面限制为特定用户的主要内容,如果未能解决你的问题,请参考以下文章
如何限制员工用户只能在 Django 管理页面中查看他们的信息?