【问题标题】:To determine the user's role in the project确定用户在项目中的角色
【发布时间】:2017-07-29 05:55:19
【问题描述】:

在我的 django 网站中,我有“project_list”和“project_detail”之类的页面。每个项目都有不同角色的成员(开发人员、经理等)。我想根据当前用户在模板项目中的角色显示不同的按钮。我需要想法如何实现它。让我们在模板中说这样的话:

{% if request.user.role_in_the_current_project = 'manager' %} 播种东西 {% endif %}

models.py

class Project(models.Model):
    name = models.CharField(max_length=250,)
    slug = models.SlugField(max_length=250, unique_for_date='publication_date',)
    *Other fields*

    def get_absolute_url(self):
        return reverse('project:project_detail', args=[self.slug])

class Membership (models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    project = models.ForeignKey(Project, on_delete=models.CASCADE)

    ROLE_CHOICES = (
        ('manager', 'Manager'),
        ('developer', 'Developer'),
        ('business_analyst', 'Business analyst'),
        ('system_analysts', 'System analysts'),
    )

    role = models.CharField(max_length=20, choices=ROLE_CHOICES,)

view.py

def project_detail(request, slug):
    project = get_object_or_404(Project, slug=slug, status='public')
    return render(request, 'project/project_detail.html', {'project': project,})

project_detail.html

{% block content %}
   <h1>{{ project.name }}</h1>
   <p>{{ project.description|linebreaks }}</p>
{%endblock %}

urls.py

urlpatterns = [
    url(r'^project/(?P<slug>[-\w]+)/$', project_detail, name='project_detail'),
]

【问题讨论】:

    标签: python django python-3.x django-templates django-views


    【解决方案1】:

    您可以在模型字段中使用choices 的概念,然后通过使用这些概念,您可以在模板中(或视图)做出决定以显示适当的内容。

    如果您需要这方面的更多信息,请告诉我。

    [编辑]:所以,你想要的是每次检查role 的值。对吧?

    在你的views.py 写:

    project = get_object_or_404(Project, slug=slug, status='public')
    memberships = project.membership_set.all()
    

    那么由于一个项目可以有许多 Membership 记录,您应该遍历 memberships 以每次获取 role

    所以,在您的模板中:

    {% for membership in memberships %}
        {% if membership.role == 'Manager' %} Do stuff here {% endif %}
    {% endfor %}
    

    请注意,.role 将返回 ROLE_CHOICES 子元组的第二个值,它是大写的,而第一个值将在您使用函数 get_role_display() 时显示在用户中

    【讨论】:

    • 我知道。我需要帮助来实现。正如您在模型成员中看到的那样,我有带有选择概念的角色字段。现在我对 project_detail 视图有点困惑,以获取请求用户在该项目中的角色。
    • 我在模板中使用了这个,但没有帮助{% if request.user.project.membership__role == 'manager' %}&lt;button&gt;Create&lt;/button&gt;{% endif %}您还有其他想法吗?
    • 只是 {% if request.user.role = 'Manager' %} 不起作用。好难过=(
    • '{% for members in members %}' 也不起作用。我认为我们需要以某种方式说系统是否在视图内请求用户?你觉得怎么样?
    • 为什么它不起作用?请在memberships = project.membership_set.all() 行之后添加[print(m.role) for m in memberships]。你得到了什么?
    【解决方案2】:

    好吧,毕竟我找到了解决方案。在视图中我添加:

    is_manager = project.membership_set.filter(user=request.user, role='Manager').exists()
    

    然后在模板中添加:

    {% if is_manager %}
        <button>Create</button>
    {% endif %}
    

    【讨论】:

    • 很高兴你知道了!我昏迷了,没有想清楚。我想我需要睡一会儿。编码愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多