上周刚开始使用Django,我正面临有关两种类型的用户(普通用户和VIP用户)以及如何限制普通用户查看VIP内容的问题。
我正在将Django与MySQL配合使用。我的网站不需要用户注册,但我将为他们提供用户名/密码。我通过Django管理员手动创建用户,并根据VIP或普通用户对其进行分组。我将上载内容(同样通过admin),并且我有一个布尔复选框,该复选框确定它是否是VIP内容。
到目前为止,我所做的是:
用户必须登录才能查看内容
登录后,VIP可以看到VIP内容,普通用户将无法看到VIP内容。
FAQ.html
{% extends 'base.html' %}
...skipping...
{% for faqs in fq reversed %}
<a href="{% url 'faq_topics' faqs.pk %}">{{ faqs.name }}</a>
{{ endfor }}
faq_topics.html
<h2>{{ faqs.name }}</h2>
<h6 style="padding: 20px 20px 20px 20px">{{ faqs.description|linebreaksbr }}</h6>
urls.py
urlpatterns = [
path('faq/', views.faq, name='faq'),
url(r'^faq/(?P<pk>\d+)/$', views.faq_topics, name='faq_topics'),]
views.py
def is_user(user):
return user.groups.filter(name='User').exists()
def is_vip(user):
return user.groups.filter(name='VIP').exists()
@login_required
@user_passes_test(is_user)
def faq(request):
fq = FAQ.objects.filter(vip_only=False)
return render(request, 'faq.html', {'fq':fq})
models.py
class FAQ(models.Model):
name = models.CharField(max_length=30, unique=True)
description = models.CharField(max_length=300)
vip_only = models.BooleanField(default=False)
错误案例
进行了3个FAQ条目,第一个被归类为VIP。
普通用户登录到“常见问题”部分时,他/她只会看到2个内容
欢迎来到常见问题解答部分
127.0.0.1:8000/faq/3/
127.0.0.1:8000/faq/2/
但是,用户可以轻松地猜测faq / 1 /存在,并且当他们实际尝试时,他们也可以访问vip内容。
在过去的两天里,我一直在网上搜索内容,我将学习如何使用@user_passes_test来限制用户和objects.filter(vip_only = False)来限制内容。
另外,我希望我的views.py控制两种用户的内容,但我尚未实现。如果有人可以教我如何在一个模板中实现“ 2个视图”,将不胜感激。
相关分类