Aman Baid
Aman Baid

Reputation: 47

how to populate current user in django forms

I have 2 models, Employee and Leave, where Employee is a foreign key in Leave. Now when an Employee is applying for a Leave, I want the Employee name option to be limited to only the logged-in user rather than all employees. Can I create a custom input with read-only and send user data using {{}}? I'm not able to retrieve data from input group to models.

Here is my code.

models.py:

class Employee(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    no_of_leaves = models.IntegerField(
        null=False,
        validators=[MinValueValidator(1), MaxValueValidator(24)],
        default=24
    )

    def __str__(self):
        return self.user.username



class Leave(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, default="")
    start_date = models.DateField(auto_now_add=False)
    end_date = models.DateField(auto_now_add=False)
    req_date = models.DateTimeField(default=datetime.datetime.now())
    approved_by = models.CharField(max_length=100,blank=True)
    STATUS_OPTIONS = (
        ("Approved","Approved"),
        ("Pending","Pending"),
        ("Declined","Declined"),
    )
    approved = models.CharField(max_length=10, choices=STATUS_OPTIONS, default='Pending')

    def __str__(self):
        return self.employee.user.username

    @property
    def date_diff(self):
        return (self.end_date - self.start_date).days

forms.py:

class leaveForm(forms.ModelForm):
    class Meta():
        model = Leave
        fields = ('employee', 'start_date', 'end_date')
        # start_date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}))
        widgets = {
            'start_date': DateInput(attrs={'type': 'date'}),
            'end_date': DateInput(attrs={'type': 'date'})
        }

views.py:

@login_required
def applyforleave(request):
    user=request.user
    emp=Employee.objects.get(user=user)

    submitted= False

    if request.method == 'POST':
        leave_form = leaveForm(data=request.POST)
        emp_name=employee(data=request.POST)

        if leave_form.is_valid() and emp_name.is_valid():
            emp_name.save()
            start_date = leave_form.cleaned_data.get("start_date")
            end_date = leave_form.cleaned_data.get("end_date")
            days = (end_date - start_date).days
            days_checker = emp.no_of_leaves - days
            if 0 < days_checker < emp.no_of_leaves:
                leave = leave_form.save()
                leave.set_employee
                leave.save()
                submitted = True
            else:
                print("error")
        else:
            print(leave_form.errors)
    else: 
        leave_form = leaveForm()
    
    return render(
        request,
        'leaveApp/leave.html',
        {
            'leave_form': leave_form,
            'submitted': submitted,
            'emp': emp
        }
    )

leave.html:

<div class="container">
    <div class="jumbotron">
        <form enctype="multipart/form-data" method="POST">
            {% csrf_token %}
            {{ leave_form.as_p }}
      
            <input  type="submit" name="" value="Submit">
        </form>
    </div>
</div>

Upvotes: 0

Views: 122

Answers (1)

Agus Mathew
Agus Mathew

Reputation: 941

def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        user= self.request.user

        super(leaveForm, self).__init__(*args, **kwargs) 

add the above init in forms.py

labels = {'employee': user}
    
        statistics = forms.Field(
            label=user,
        )

this in your forms.py

and pass request from views.py

leave_form = leaveForm(request)
        

You can also check the docs for using the initial parameter docs

Upvotes: 1

Related Questions