Set default values in Django form based on user's id/instance

I have created a customUser, then the foreign key of model class AddressBook (models.Model) is customUser.Id. Model Employer inherited from customUser. The other two models are class employee(CustomUser) and class Job(models.Model)

Employer and Staff user could create a job. Now I would like to set fields of Employer and AddressBook in job form to be corresponding employer_org name and employer address if login user is employer. i.e. if employer 1 login, the job form will automatically show employer 1 org name and employer1 address. If employer 2 login, the fields will be employer2 org name and employer2 address. When Staff users sign in, they can select or type employer org name and employer address. Now my problem is even I sign in as employer 1, I can create a job for employer 2 when click the selection field.

enter image description here

enter image description here Here is my models:

class AddressBook(models.Model):
    
    user=models.ForeignKey(get_user_model(),on_delete=models.CASCADE)
    street = models.CharField(max_length=64,blank=False)
    alt_line = models.CharField(max_length=64, blank=True)
    postcode= models.CharField(max_length=5,
      validators=[RegexValidator('^[0-9]{5}$', _('Invalid postal code'))],
    blank=False)
    city = models.CharField(max_length=64, blank=False)
    country = models.CharField(max_length=64, default="some name")

    class Meta:
        verbose_name = 'AddressBook'

    def __str__(self):
        return '{} {}, {}, {}'.format(self.street, self.alt_line, self.postcode, self.city)


class CustomUser(AbstractBaseUser, PermissionsMixin):
    first_name = models.CharField(max_length=250, blank=False)
    last_name = models.CharField(max_length=250, blank=False)
    email = models.EmailField(('email address'), unique=True)
    phone = PhoneNumberField(blank=True, help_text='Contact phone number', unique = True,null=True)

    is_employee = models.BooleanField(default=False)
    is_employer = models.BooleanField(default=False)
    is_staff=models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    objects = CustomUserManager()

    def has_perm(self, perm, obj=None):
        return self.is_staff

    def __str__(self):
        return self.email


class Employer(CustomUser):

    org_name=models.CharField(max_length=64)
    class Meta:
        verbose_name = 'Employer'

    #def __init__(self, *args, **kwargs):
        #super().__init__(*args,**kwargs)

    def __str__(self):
        return '{}'.format(self.org_name,self.phone)    

class Job(models.Model):
    employee=models.ForeignKey(Employee,on_delete=models.CASCADE,related_name="Job_employee", blank=True,null=True)
    employer=models.ForeignKey(Employer,on_delete=models.CASCADE, related_name="Job_employer")
    pub_date=models.DateTimeField('Date published',auto_now_add=True)
    updated_date = models.DateTimeField(auto_now_add=True,null=True, blank=True)
    address=models.ForeignKey(AddressBook,on_delete=models.CASCADE,related_name="job_street")
    job_date=models.DateField('Job Date')
    details=models.CharField(max_length=200, blank=True, null=True)
    user=models.ForeignKey(get_user_model(),on_delete=models.CASCADE,null=True,blank=True) 
    
`
#The view is 

@login_required
@admin_staff_employer_required

def createJob(request):

    user=request.user
    employer=Employer.objects.all()
    
    form = JobForm()
    if request.method == 'POST':
        
        initial_data={
            'employer':group.get_employer(),
            'address' :group.get_address()

        }
        
        if request.user.is_employer:
            form = JobForm(initial=initial_data)
        else:
            form = JobForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "The job has been created")
            return redirect('/')
        else:
            
            messages.error(request,"Please correct your input field and try again")

    context = {'form':form}
    return render(request, 'create_job.html', context)

# form 


class JobForm(ModelForm):

    class Meta:
        model = Job
        fields = '__all__'
        widgets = {
                'job_date': DatePickerInput(),
                'start_time': DateTimePickerInput(),
                'finish_time':DateTimePickerInput(),
            }

    def clean(self):  
        cleaned_data = super().clean()
        job_date = cleaned_data['job_date']
        start_time = cleaned_data['start_time']
        finish_time = cleaned_data['finish_time']
        now = timezone.now()
        current_date =datetime.now()
        return cleaned_data

#html


{{form.employer |as_crispy_field}}
{{form.address |as_crispy_field}}
{{form.job_date |as_crispy_field}}

Here is a picture of how to form looks like. How can I set default value to the form if login user is an employer, and login user id == job.employer.id?

There are several similar answers, but none of them worked in my case.

Back to Top