Я делаю СУО. Когда Пользователь подает заявку на отпуск, а администратор принимает или отклоняет его. Прямо сейчас я застрял в проблеме, когда я хочу, чтобы пользователь подал заявку на отпуск через форму Django, выбрав тип отпуска (случайный, больничный, половинная оплата и т. д.), если администратор принимает его, тогда значения по умолчанию в базе данных изменяются или вычитается из модели Сотрудник, и когда счетчик достигает 0, генерируется ошибка, что у вас нет отпусков, свяжитесь с администратором.
Я не могу понять, как сделать логику для этого.
Я попытался применить оператор if else в представлениях и даже в моделях.
просмотры.py
The function name is "Reject" as I am trying to make changes to the accept function.
def reject_leave(request, id):
# employee_item = Employee.objects.get(id=id)
all_item = Leave.objects.get(id=id)
all = Employee.objects.get(id=id)
context = {'all': all,'all_item': all_item}
'''
if the leave_type (choice field of the leaves from the django form) equals to a leave type like Annual leave
The the program deducts 1 or the amount entered from the total value of Annual leave from the Model Employee
'''
*Sorry for the poor writing I'm not experienced in Django*
***This code is saying that in an illogical way.***
if leave_type.id is "Annual_leave":
Annual_leave - 1
else:
subject = "Leave Rejected" # email subject
email_from = "settings.EMAIL_HOST_USER" # email from
to_email = ['[email protected]'] # email to
with open(...) as f:
msgbody = f.read()
msg = EmailMultiAlternatives(
subject=subject, body=msgbody, from_email=email_from, to=to_email)
html_template = get_template(...).render()
msg.attach_alternative(html_template, "text/html")
msg.send()
return render(request, 'projectfiles/rejectemail.html',context)
формы.py
class Leave_Form(forms.ModelForm):
to_date = forms.DateField(
widget=forms.DateInput(format=('%m/%d/%y'),
attrs = {'class': 'form-control',
'placeholder': ' Month/Date/Year'}))
from_date = forms.DateField(
widget=forms.DateInput(format=('%m/%d/%y'),
attrs = {'class': 'form-control',
'placeholder':' Month/Date/Year'}))
class Meta:
model = Leave
fields = ['leave_Type', 'description',
'from_date', 'to_date', 'leave_qty']
exclude = ['employee_leaves', 'submit_date']
leave_type_choice = (
("Annual_leave", "Annual leave"),
("Sick_leave", "Sick leave"),
("Casual_leave", "Casual leave"),
("Emergency_leave", "Emergency leave"),
("Half_pay","Half Pay")
)
widgets = {
'leave_Type': forms.Select(choices = leave_type_choice, attrs = {'class': 'form-control'}),
'description': forms.Textarea(
attrs = {'class': 'form-control','placeholder': 'Enter description here', 'rows': 3, 'cols': 21})}
модели.py
class Employee(models.Model):
employee_name = models.OneToOneField(User, on_delete = models.CASCADE)
employee_designation = models.CharField(max_length = 20)
employee_department = models.CharField(max_length = 35)
Annual_leave = models.PositiveSmallIntegerField(default=10)
Sick_leave = models.PositiveSmallIntegerField(default=3)
Casual_leave = models.PositiveSmallIntegerField(default=3)
Half_pay = models.PositiveSmallIntegerField(default=4)
Emergency_leave = models.PositiveSmallIntegerField(default=3)
allowed = models.BooleanField(default=False)
def __str__(self):
return self.employee_name.username
class Meta:
verbose_name_plural = "Employee"
class Leave(models.Model):
employee_leaves = models.ForeignKey(Employee, on_delete=models.CASCADE)
leave_Type = models.CharField(max_length=25)
leave_qty = models.PositiveSmallIntegerField(default=0)
description = models.CharField(max_length=75, blank=True, null=True)
submit_date = models.DateTimeField(auto_now_add=True)
from_date = models.DateField(auto_now=False, auto_now_add=False)
to_date = models.DateField(auto_now=False, auto_now_add=False)
class Meta:
verbose_name_plural = "Leave"
def __str__(self):
return self.leave_Type + " by " + str(self.employee_leaves)
Когда Админ принимает (или в данном случае отклоняет) отпуск. например Больничный Я хочу, чтобы 1 или введенное количество отпусков вычиталось из общего количества выделенных больничных листов.
да, это не определено, даже если я передам его как обычно. Я хочу, чтобы он извлек значения по умолчанию из модели Работник и сравнил, остались ли какие-либо листья. Я не понимаю, как это сделать.
def reject_leave(request, id): # overwriting built-in id is not a good idea
all_item = Leave.objects.get(id=id) # This is a single item, not all items
all = Employee.objects.get(id=id) # this again is a single item, not all items
context = {'all': all, 'all_item': all_item}
if leave_type.id is "Annual_leave":
# What is leave_type?
Annual_leave - 1
# What is Annual_leave? What does -1 supposed to do?
# Maybe you meant
# employee = Employee.objects.get(id=id)
# leave = employee.employee_leaves_set.last()
# if leave.leave_Type == 'Annual_leave':
# employee.Annual_leave -= 1
# employee.save()
else:
subject = "Leave Rejected"
email_from = "settings.EMAIL_HOST_USER"
to_email = ['[email protected]']
with open('...') as f:
msgbody = f.read()
msg = EmailMultiAlternatives(
subject=subject, body=msgbody, from_email=email_from, to=to_email)
html_template = get_template(
"...").render()
msg.attach_alternative(html_template, "text/html")
msg.send()
return render(request, 'projectfiles/rejectemail.html', context)
В этом так много неправильного, что я могу с уверенностью сказать, что вы не изучали учебник по python, не читали pep-8 и не изучали учебник по django. Поэтому, пожалуйста, начните с первого и продвигайтесь вверх.
Объект «Сотрудник» не имеет атрибута «employee_leaves_set»
Мой плохой, employee.leave_set.last()
Это работает СПАСИБО и, пожалуйста, объясните мне, что я сделал неправильно и как я могу улучшить свою логику.
Я попытался объяснить это в комментариях к Python во фрагменте кода, не знаю, смогу ли я объяснить это дальше, но рад, что смог помочь. Кроме того, кашляетздесь
Но теперь я получаю это. AttributeError в объекте /rejectmail/2/ 'NoneType' нет атрибута 'leave_Type'
Это означает, что у работника нет отпусков.
if leave_type.id is "Annual_leave":
? leave_type кажется неопределенным. ТакжеAnnual_leave - 1
это не настоящее задание