Django根据不同的用户组部分限制内容

上周刚开始使用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个视图”,将不胜感激。


梵蒂冈之花
浏览 275回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python