Odera Okonkwo
Odera Okonkwo

Reputation: 57

Django - filter drop down choices based on user group

i am trying to filter a forms drop down list based on a users group

To find the user group i am using a custom templatetag

template tag

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>

models

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

the template for the form is based on the forms.py

forms.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')

so for example if the user is in group "developer", the drop down choices for status will be only verified and done

Upvotes: 2

Views: 1720

Answers (1)

anjaneyulubatta505
anjaneyulubatta505

Reputation: 11695

You can do like below

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>

I think no need of template tag for this.

Upvotes: 1

Related Questions