Reputation: 47
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
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