Python 将两个日期之间的日期传递回formatday方法

Python 将两个日期之间的日期传递回formatday方法,python,django,Python,Django,我正在学习Python和Django,正在构建一个作业管理应用程序,我有以下内容,它们都可以正常工作,并在HTML日历上显示作业。它显示开始日期和结束日期,但如果作业超过两天,则日历中会出现间隙,因为没有要显示的与作业相关的日期 我可以通过执行以下操作来获得两者之间的日期: start = job.start_time end = job.end_time between = end - start for i in range(between.days + 1): datesbetw

我正在学习Python和Django,正在构建一个作业管理应用程序,我有以下内容,它们都可以正常工作,并在HTML日历上显示作业。它显示开始日期和结束日期,但如果作业超过两天,则日历中会出现间隙,因为没有要显示的与作业相关的日期

我可以通过执行以下操作来获得两者之间的日期:

start = job.start_time
end = job.end_time
between = end - start
for i in range(between.days + 1):
    datesbetween = [start + timedelta(days=i)]
下面是my views.py文件:

class AdminCalendarView(LoginRequiredMixin,PermissionRequiredMixin, ListView):
    model = Job
    template_name = 'jobs/admin_diary.html'
    permission_required = 'jobs.add_job', 'raise_exception=True'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # use today's date for the calendar
        d = get_date(self.request.GET.get('month', None))


        # Instantiate our calendar class with today's year and date
        cal = AdminCalendar(d.year, d.month)

        jobs = Job.objects.filter(start_time__year=d.year, start_time__month=d.month)

        # Call the formatmonth method, which returns our calendar as a table
        html_cal = cal.formatmonth(jobs, withyear=True)
        context['calendar'] = mark_safe(html_cal)
        context['prev_month'] = prev_month(d)
        context['next_month'] = next_month(d)
        return context
from datetime import datetime, timedelta, date
from calendar import HTMLCalendar
from .models import Job
from django.db.models import Q

class AdminCalendar(HTMLCalendar):

    def __init__(self, year=None, month=None):
        self.year = year
        self.month = month
        super(AdminCalendar, self).__init__()

    # formats a day as a td
    # filter jobs by day

    def formatday(self, day, jobs):
        jobs_per_day = jobs.filter(Q(start_time__day=day) | Q(end_time__day=day))
        
        d = ''
        for job in jobs_per_day:
            d += f"<a href='/job/{job.id}'> <li class='job-diary'> {job.client} Job: {job.id}</li> </a>"

        if day != 0:
            return f"<td><span class='date'>{day}</span><ul> {d} </ul></td>"
        return '<td></td>'

        
    # formats a week as a tr
    def formatweek(self, theweek, jobs):
        week = ''
        i = [a_tuple[0] for a_tuple in theweek]
        for d in i:
            week += self.formatday(d, jobs)
        return f'<tr> {week} </tr>'


    # formats a month as a table
    # filter jobs by year and month
    def formatmonth(self, jobs, withyear=True):
        cal = f'<table border="0" cellpadding="0" cellspacing="0" class="calendar table-responsive">\n'
        cal += f'{self.formatmonthname(self.year, self.month, withyear=withyear)}\n'
        cal += f'{self.formatweekheader()}\n'
        for week in self.monthdays2calendar(self.year, self.month):
            cal += f'{self.formatweek(week, jobs)}\n'
        cal += f'</table>'
        return cal
utils.py文件:

class AdminCalendarView(LoginRequiredMixin,PermissionRequiredMixin, ListView):
    model = Job
    template_name = 'jobs/admin_diary.html'
    permission_required = 'jobs.add_job', 'raise_exception=True'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # use today's date for the calendar
        d = get_date(self.request.GET.get('month', None))


        # Instantiate our calendar class with today's year and date
        cal = AdminCalendar(d.year, d.month)

        jobs = Job.objects.filter(start_time__year=d.year, start_time__month=d.month)

        # Call the formatmonth method, which returns our calendar as a table
        html_cal = cal.formatmonth(jobs, withyear=True)
        context['calendar'] = mark_safe(html_cal)
        context['prev_month'] = prev_month(d)
        context['next_month'] = next_month(d)
        return context
from datetime import datetime, timedelta, date
from calendar import HTMLCalendar
from .models import Job
from django.db.models import Q

class AdminCalendar(HTMLCalendar):

    def __init__(self, year=None, month=None):
        self.year = year
        self.month = month
        super(AdminCalendar, self).__init__()

    # formats a day as a td
    # filter jobs by day

    def formatday(self, day, jobs):
        jobs_per_day = jobs.filter(Q(start_time__day=day) | Q(end_time__day=day))
        
        d = ''
        for job in jobs_per_day:
            d += f"<a href='/job/{job.id}'> <li class='job-diary'> {job.client} Job: {job.id}</li> </a>"

        if day != 0:
            return f"<td><span class='date'>{day}</span><ul> {d} </ul></td>"
        return '<td></td>'

        
    # formats a week as a tr
    def formatweek(self, theweek, jobs):
        week = ''
        i = [a_tuple[0] for a_tuple in theweek]
        for d in i:
            week += self.formatday(d, jobs)
        return f'<tr> {week} </tr>'


    # formats a month as a table
    # filter jobs by year and month
    def formatmonth(self, jobs, withyear=True):
        cal = f'<table border="0" cellpadding="0" cellspacing="0" class="calendar table-responsive">\n'
        cal += f'{self.formatmonthname(self.year, self.month, withyear=withyear)}\n'
        cal += f'{self.formatweekheader()}\n'
        for week in self.monthdays2calendar(self.year, self.month):
            cal += f'{self.formatweek(week, jobs)}\n'
        cal += f'</table>'
        return cal
从datetime导入datetime、timedelta、date
从日历导入HTMLCalendar
从。模型导入作业
从django.db.models导入Q
类管理员日历(HTMLCalendar):
定义初始(自我,年=无,月=无):
self.year=年
self.month=月
超级(AdminCalendar,self)。\uuuu init\uuuuu()
#将一天的格式设置为td
#按天筛选作业
def formatday(自我、日、作业):
jobs_per_day=jobs.filter(Q(开始时间_day=day)| Q(结束时间_day=day))
d=“”
对于每天作业中的作业:
d+=f“”
如果有一天0:
返回f“{day}
    {d}
” 返回“” #将一周的格式设置为tr def formatweek(自我、每周、作业): 周=“” i=[a_tuple[0]表示一周中的a_tuple] 对于i中的d: 周+=自我形成日(d,作业) 返回f'{week}' #将月份格式化为表格 #按年度和月份筛选作业 def formatmonth(self,jobs,withyear=True): cal=f'\n' cal+=f'{self.formatmonthname(self.year,self.month,withyear=withyear)}\n' cal+=f'{self.formatweekheader()}\n' 对于self.monthdays2日历中的周(self.year,self.month): cal+=f'{self.formatweek(week,jobs)}\n' cal+=f'' 返回cal
然而,我不确定我需要如何将这些日子传递回formatday()方法,或者如果我应该寻找一种不同的方法来完成它,因为这对我来说是全新的,任何帮助都将不胜感激


谢谢

在您的
formatday
功能中,您可以通过执行以下操作来筛选介于开始日期和结束日期(包括这些日期)之间的作业:

def formatday(self, day, jobs):
    jobs_per_day = jobs.filter(start_time__day__gte=day, end_time__day__lte=day)

这将为您提供从开始到结束的任意天数的作业,包括开始和结束。然后,当前代码将在作业跨越的任何一天显示作业。我相信这就是您所要求的,但如果没有,请随时澄清。

谢谢@joed4no,是的,这正是我想要的,但是我尝试了上述操作,它返回了一个空查询集?