Как передать параметр в форму?

У меня есть класс формы (неправильный) :

class TeamGoalForm(ModelForm):
    class Meta:
        employees = forms.ModelMultipleChoiceField(queryset=Employee.objects.filter(departament=Department.objects.get(manager=Manager.objects.get(end_user_id = request.user.username.upper())),widget=forms.CheckboxSelectMultiple()))
        department = forms.ModelChoiceField(queryset=Department.objects.all())
        model = TeamGoal
        fields = '__all__'
       
        widgets = {
                'employees' : forms.Select(attrs={'class': 'form-control', 'placeholder':'Select employees'}),
            }
                'department':forms.Select(attrs={'class': 'form-control', 'placeholder':'Select department'}),

Я хочу передать параметр request.user.username.upper(), который у меня есть в моем view.py. Как реализовать это в моем TeamGoalForm?

my view.py

@login_required(login_url='login')
def add_team_goal(request):
    form = TeamGoalForm(is_manager(request))

    if request.method == 'POST':
        form = TeamGoalForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('team_goal')

    team = get_team(request)

    if team.exists():
        return render(request, 'smth.html', {'form':form,'team':team})

Моя модель сотрудника:

# Employee section
class Employee(models.Model):
    name                = models.CharField(max_length=30, verbose_name='Name')
    lastname            = models.CharField(max_length=30, verbose_name='Lastname')
    .............
    history             = HistoricalRecords()

    
    def __str__(self):
        return self.name + ' ' + self.lastname

Мой отдел:

class Department(models.Model):
    id          = models.AutoField(primary_key=True)
    title       = models.CharField(max_length=30)
    .........
    manager     = models.ForeignKey(Manager, related_name='manager_name', null=True, on_delete = models.SET_NULL)
    
    history     = HistoricalRecords()

Мои менеджеры:

class Manager(models.Model):
    id          = models.AutoField(primary_key=True)
    name        = models.CharField(max_length=30)
    lastname    = models.CharField(max_length=30)
    history     = HistoricalRecords()

    def __str__(self):
        return self.name + ' ' + self.lastname

Моя цель команды:

class TeamGoal(models.Model):
    team_goal_title = models.CharField(max_length=30, verbose_name='Title')
    team_goal_description = models.CharField(max_length=100, blank=True, verbose_name='Description')
    department = models.ForeignKey(Department, verbose_name='Department', on_delete = models.CASCADE, related_name='+', blank=True, null=True, help_text=u'If you assign the team goal for the whole department, please fill only Department field and skip Employee field.')
    employees  = models.ManyToManyField(Employee, null=True,  blank=True, symmetrical=False, related_name='employee_name')
    ......
    history = HistoricalRecords()

В моем приложении я могу создать командную цель для всего отдела или для определенной группы сотрудников.

Я бы очень советовал не давать Manager то же имя, что и пользователь, и затем сопоставлять его: это затрудняет синхронизацию записей. Вы можете связать модель пользователя с:

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}'

Вы можете передать пользователя в качестве параметра в ModelForm и затем отфильтровать набор запросов:

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'})
        }

и в представлении передайте вошедшего пользователя в 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})
Вернуться на верх