Django/Python如何仅当用户是“任务”的作者或负责人时才显示“任务”

2024-09-29 23:22:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python和django新手,我需要一些帮助

我想做的是,只有当用户是负责人或相关“任务”的作者时,才显示特定的“任务”

我试图用html模板中的if语句来实现这一点:

    {% for task in task_list %}
    <h2>title - {{task.title}}</h2>
    {% endfor %}
    {% endif %}

但没有返回我期望的结果,因为:

    {% for task in task_list %}
    <h2>author --- {{task.author}}</h2>
    <h2>responsable --- {{task.responsable}}</h2>
    {% endfor %}

返回相同的用户。。。我认为问题在于,当我引用user.username时,它会进入数据库并返回一个查询,当我引用user{{task.blabla}}时,它是一个字符串,我是对的?我怎样才能解决这个问题

models.py:

    title = models.CharField(max_length=50)
    content = models.TextField(blank=True)
    date_created = models.DateTimeField(auto_now_add=True)
    due_date = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE, default=User)
    responsable = models.ForeignKey(User, on_delete=models.CASCADE, related_name="author", default=User)
    STATUS_CHOICES = [('D', 'Done'),('P','Doing'),('N','Not done')]
    Status = models.CharField(max_length=1,choices=STATUS_CHOICES, default='N')
    IMPORTANCE_CHOICES = [('H', 'High'),('M','Medium'),('L','Low')]
    importance = models.CharField(max_length=1,choices=IMPORTANCE_CHOICES, default='M')
    DEPARTAMENT_CHOICES = [('D', 'Dev'),('M','Marketing'),('H','Human Resources'),('L','Legal'),('F','Financial'),('O','Others')]
    departament = models.CharField(max_length=1,choices=DEPARTAMENT_CHOICES, default='M')

    def  __str__(self):
        return self.title

views.py

def dashboard_taskapp(request):
    task = Task.objects.all()
    context = {
        "task_list": task,
    }
    return render(request, "task_app/task_dashboard.html", context)

提前感谢并致以亲切的问候


Tags: 用户defaulttasktitlemodelsh2lengthmax
2条回答

因此,这里更干净、更安全的解决方案是使用Class Based Views(CBV)。有一个专门为显示对象列表而创建的通用CBV-ListView。为了准确实现您所做的,代码将显示如下:

from django.views.generic.list import ListView

class DashboardTaskAppView(ListView):
    
    template_name = "task_app/task_dashboard.html"
    
    # we override this method to 
    # get the queryset of objects we want to display
    # rest of the work will be taken care of by "djnago"
    def get_queryset(self):
        usr = request.user
        return Task.objects.filter(Q(author=usr) | Q(responsible=usr) | Q(public=True))

现在要在模板中获得想要的结果,我们只需像这样调用它

    {% for task in object_list %}
       <h2>title - {{task.title}}</h2>
    {% endfor %}

当使用CBV时,请记住在URL中使用如下路径

path('your_url/', DashboardTaskAppView.as_view(), name='your_name'),

请阅读文档以发现完整的Django通用视图。它确实加快了您的工作速度,稍后重新格式化需要几秒钟而不是几小时

我希望这就是你想要实现的。首先,修改taskqueryset,使其仅显示所选人员的任务。(您需要为或contidion导入Q)

from django.db.models import Q

def dashboard_taskapp(request):
    usr = request.user
    task = Task.objects.filter(Q(author=usr) | Q(responsible=usr))
    context = {
        "task_list": task,
    }
    return render(request, "task_app/task_dashboard.html", context)

然后,没有必要限制你的模板,所以最终它会是这样的

    {% for task in task_list %}
    <h2>title - {{task.title}}</h2>
    ... whatever you wanna show here ...
    {% endfor %}

相关问题 更多 >

    热门问题