[Answered ]-How to pass parameter into the Form?

1๐Ÿ‘

โœ…

I would really advise not to give Manager the same name as a user and then match on that: it makes keeping records in sync quite hard. You can link to the user model with:

from django.conf import settings

class Manager(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    history = HistoricalRecords()

    def __str__(self):
        return f'{self.user.first_name} {self.user.lastname}'

you can pass the user as parameter to the ModelForm and then filter the queryset:

class TeamGoalForm(ModelForm):
    
    def __init__(self, *args, user=None, **kwargs):
        super().__init_(*args, **kwargs)
        if user is not None:
            self.field['employees'] = Employee.objects.filter(
                department__manager__user=user
            )
    
    class Meta:
        model = TeamGoal
        fields = '__all__'
        widgets = {
            'employees' : forms.SelectMultiple(attrs={'class': 'form-control', 'placeholder':'Select employees'}),
            'department':forms.SelectMultiple(attrs={'class': 'form-control', 'placeholder':'Select department'})
        }

and in the view pass the logged in user to the TeamGoalForm:

@login_required(login_url='login')
def add_team_goal(request):
    if request.method == 'POST':
        form = TeamGoalForm(request.POST, user=request.user)
        if form.is_valid():
            form.save()
            return redirect('team_goal')
    else:
        form = TeamGoalForm(user=request.user)
    team = get_team(request)
    return render(request, 'smth.html', {'form':form,'team':team})

Leave a comment