Skip to main content
 首页 » 编程设计

python之Django之根据用户组过滤下拉选项

2024年12月31日31虾米哥

我正在尝试根据用户组过滤表单下拉列表

要查找我正在使用自定义模板标签的用户组

模板标签

from django import template  
 
register = template.Library() 
 
@register.filter(name='in_group') 
def in_group(user,group_name): 
    try: 
        group=Group.objects.get(name=group_name) 
    except Group.DoesNotExist: 
        return False 
    return group in user.groups.all() 

task.html

  {% load group_check %} 
 
<form method="post"> 
  {% csrf_token %} 
  {% if user.is authenticated %} 
  {% if requset.user|in_group:'DEVELOPER' %} 
    #...DO SOMETHING 
 
  {{ form.as_p }} 
 
 
 
  <button type="submit">add task</button> 
</form> 

模型

GOALS_TYPE= (('DT','Daily Task'), 
        ('WT','Weekly Task'), 
        ('V','Verified'), 
        ('D','Done'), 
) 
 
class GoalStatus(models.Model): 
    title = models.CharField(max_length=254, null=True)  
    task_id=models.IntegerField(default=1,null=False) 
    description =models.CharField(max_length=254) 
    verified_by=models.ForeignKey('ScrumyUser', on_delete= models.CASCADE, null=True) 
    status=models.CharField(choices=GOALS_TYPE, max_length=2, default='DT') 
    def __str__(self): 
        return self.title 

表单模板基于forms.py

表单.py

class ChangeTaskForm(forms.ModelForm): 
  class Meta: 
    model = GoalStatus 
    fields = ('title', 'task_id','description','status', 'verified_by')  

views.py

def move_goals(request,pk): 
  if request.method == 'POST': 
    form = ChangeTaskForm(request.POST) 
    if form.is_valid(): 
        return HttpResponseRedirect('/index/') 
  else: 
    form = ChangeTaskForm() 
  return render(request, 'oderascrumy/task.html', {'form': form}) 

urls.py

 path('task/<pk>/', views.move_goals, name='move_goals') 

例如,如果用户在组“developer”中,则状态的下拉选项将仅被验证和完成

请您参考如下方法:

你可以像下面那样做

views.py

def move_goals(request,pk): 
  if request.method == 'POST': 
    form = ChangeTaskForm(request.POST, user=request.user) 
    if form.is_valid(): 
        return HttpResponseRedirect('/index/') 
  else: 
    form = ChangeTaskForm(user=request.user) 
  return render(request, 'oderascrumy/task.html', {'form': form}) 

forms.py

class ChangeTaskForm(forms.ModelForm): 
  def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user', None) 
     super(ChangeTaskForm, self).__init__(*args, **kwargs) 
     if user.groups.filter(name='DEVELOPER').exists(): 
        self.fields['status'].choices = (('V','Verified'), ('D','Done'),) 
  class Meta: 
    model = GoalStatus 
    fields = ('title', 'task_id','description','status', 'verified_by') 

template.html

<form method="post"> 
  {% csrf_token %} 
  {{ form.as_p }} 
  <button type="submit">add task</button> 
</form> 

我认为不需要模板标签。