Как написать функции / определения, чтобы отображать в HTML-шаблонах Django? - PullRequest
0 голосов
/ 28 августа 2018

models.py

from django.db import models
from django.contrib.auth.models import User

CHOICES = (('Earned Leave','Earned Leave'),('Casual Leave','Casual Leave'),('Sick Leave','Sick Leave'),('Paid Leave','Paid Leave'))

class Leave(models.Model):

    employee_ID = models.CharField(max_length = 20)
    name = models.CharField(max_length = 50)
    user = models.ForeignKey(User, on_delete = models.CASCADE, null =True)
    type_of_leave = models.CharField(max_length = 15, choices = CHOICES)
    from_date = models.DateField()
    to_date = models.DateField()
    )

    def __str__(self):
        return self.name

views.py

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from .forms import LeaveRequestForm
from django.shortcuts import render_to_response
from .models import Leave
...
def leaveRequest(request):
form_class = LeaveRequestForm

if request.method == "POST":
    form = LeaveRequestForm(request.POST)
    if form.is_valid():
        leave = form.save(commit = False)
        leave.user = request.user
        form.save()
    return HttpResponseRedirect("/thanks/")
else:
    return auto_fill_form(request)
def leaves_sick(request):
    data = Leave.objects.filter(employee_ID = request.user.username)
    sl = "sg"
    for obj in data:
        if obj.type_of_leave == 'Sick Leave':
            sl += obj.date_diff
    return render(request, "status.html",{'sl':data})

forms.py

from django.forms import ModelForm, Textarea, DateInput
from lrequests.models import Leave

class LeaveRequestForm(ModelForm): 
    class Meta:
        fields = ("name",  "type_of_leave", "from_date", "to_date")
        model = Leave

urls.py

from django.urls import path, include
from . import views

app_name='lrequests'

urlpatterns = [
    path('lrequests/',views.leaveRequest, name = 'request'),
    path('status/', views.get_data, name = 'status'),
    path('status/', views.leaves_sick, name = 'sick'),


]

По сути, это функция, которая работает с посещаемостью сотрудника, типом отпусков и т. Д. Если сотрудник запрашивает отпуск с типом «el» (Заработанный отпуск), мне нужно вернуть, сколько раз в прошлом он имел запрашивается за заработанные отпуска из базы данных (при условии, что в базе данных есть несколько запросов от пользователя)

Я работаю над "системой управления отпуском". Мне нужно знать, сколько раз пользователь запрашивал отпуск. Сначала пользователь отправляет администратору форму запроса на отпуск с помощью ModelForms. Существуют типы отпусков, такие как "earned_leave", .... и т. Д. Теперь мне нужно получить данные, сколько раз сотрудник запрашивал отпуск для «заработанного_платы», «оплаченного_платы», ... и т. Д. И отражать это число в шаблоне.

* Обновление - я использую dbsqlite3 db по умолчанию.

def leave_count(request):
        queryset = Leave.objects.filter(employee_ID = request.user.username, type_of_leave = 'Sick Leave')
        return render(request, "history.html", {'queryset' : queryset})

С тех пор я не знаю, как запросить базу данных, которую я поместил в views.py. Это не сработало.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Теперь мне нужно получить данные, сколько раз сотрудник запрашивал отпуск по "заработанному_лизу"

request.user.leave_set.filter(type_of_leave="Earned leave").count()

"paid_leave" и т. Д.

Если вы хотите получить счетчики для каждого типа отпуска в одном запросе SQL:

from django.db.models import Count
queryset = request.user.leave_set.values("type_of_leave").annotate(count=Count("type_of_leave")).order_by("type_of_leave")
for item in queryset:
    print("{type_of_leave}: {count}".format(**item))

Как передать переменную (независимо от ее типа) в шаблон довольно хорошо задокументировано, поэтому я не буду приводить здесь пример.

0 голосов
/ 28 августа 2018

Вы можете решить эту проблему в моделях:

В вашем Leave - у вас есть users в качестве внешнего ключа. На стороне пользователя - в модели вы можете написать:

def get_el(self):
      el = 0
      for x in self.Leave.iterator():
             if x.type_of_leave == 'earned_leave':
                  el++
     return el

В вашем шаблоне - вы можете написать user.get_el для рендеринга листьев.

Вам необходимо использовать некое понятие, называемое «related_name" . Кроме того, вам необходимо соответствующим образом расширить модель Пользователь .

Удачи!

...