首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HTMLCalendar显示为字符串,而不是正确使用HTML (Django)

HTMLCalendar是Django框架中的一个类,用于生成HTML格式的日历。在某些情况下,我们可能希望将HTMLCalendar生成的日历以字符串的形式输出,而不是直接渲染为HTML。为了实现这一需求,我们可以使用formatmonth方法生成日历的字符串表示。

代码语言:txt
复制
from django.utils.safestring import mark_safe
from django.contrib.sites.shortcuts import get_current_site
from django.urls import reverse
from django.contrib.auth.models import User
from django.contrib.auth import get_user_model
from django.contrib.auth.tokens import default_token_generator
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes, force_text

from datetime import datetime
from calendar import HTMLCalendar
from django.urls import reverse


class MyCalendar(HTMLCalendar):
    def __init__(self, events):
        super().__init__()
        self.events = events

    def formatday(self, day, weekday, year, month):
        if day != 0:
            cssclass = self.cssclasses[weekday]
            if date.today() == date(year, month, day):
                cssclass += ' today'
            if day in self.events:
                cssclass += ' filled'
                body = ['<ul class="event-list">']
                for event in self.events[day]:
                    body.append(f'<li>{event}</li>')
                body.append('</ul>')
                return self.day_cell(cssclass, f'<span class="day-number">{day}</span><div class="event">{"".join(body)}</div>')
            return self.day_cell(cssclass, f'<span class="day-number">{day}</span>')
        return self.day_cell('noday', '&nbsp;')

    def formatmonth(self, year, month):
        self.year, self.month = year, month
        return super().formatmonth(year, month)

    def group_by_day(self, events):
        events_by_day = {}
        for event in events:
            day = event.start_time.day
            if day in events_by_day:
                events_by_day[day].append(event)
            else:
                events_by_day[day] = [event]
        return events_by_day

    def formatweekheader(self):
        header = ''.join(f'<th class="{self.cssclasses[6]}">{day}</th>' for day in self.iterweekdays())
        return f'<thead><tr>{header}</tr></thead>'

    def formatweek(self, theweek):
        week = ''
        for day in theweek:
            cssclass = self.cssclasses[day.weekday()]
            if day.month != self.month:
                cssclass += ' different-month'
            week += self.day_cell(cssclass, day.day)
        return f'<tr>{week}</tr>'

    def day_cell(self, cssclass, body):
        return f'<td class="{cssclass}">{body}</td>'


def render_calendar(events):
    today = datetime.today()
    current_site = get_current_site(None)
    event_calendar = MyCalendar(events).formatmonth(today.year, today.month)

    html_content = render_to_string(
        'calendar.html',
        {
            'event_calendar': mark_safe(event_calendar),
            'current_site': current_site.domain,
        }
    )

    return html_content

上述代码中,我们定义了一个自定义的MyCalendar类,继承自Django的HTMLCalendar类。其中,formatday方法用于格式化每个日期单元格的内容,formatmonth方法用于格式化整个月份的日历表格。

formatday方法中,我们判断当前日期是否有事件,如果有,则将事件添加到对应日期的单元格中。在formatmonth方法中,我们首先设置当前年份和月份,然后调用父类的formatmonth方法获取HTML格式的日历。最后,我们将HTML格式的日历作为字符串返回。

为了使用这个自定义的日历类,我们还提供了一个render_calendar函数。该函数接受一个事件列表作为参数,生成对应的日历并渲染为HTML字符串。

注意:以上代码中的calendar.html为日历模板文件,你可以根据自己的需求来创建和修改。

这个自定义的日历类和渲染函数可以应用于各种场景,例如展示网站的活动日历、日程安排等。你可以根据具体的业务需求,在模板文件中自定义样式和布局。

腾讯云相关产品推荐:

  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 云函数(SCF):https://cloud.tencent.com/product/scf
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai

以上链接提供了关于腾讯云各个产品的详细介绍和使用指南,你可以根据具体需求选择适合的产品进行开发和部署。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CA1831:在合适的情况下,字符串使用 AsSpan 不是基于范围的索引器

规则说明 对字符串使用范围索引器并将其分配给范围类型时,将触发此规则。...Span 上的范围索引器是非复制的 Slice 操作,但对于字符串中的范围索引器,将使用方法 Substring 不是 Slice。 这会生成字符串所请求部分的副本。...AsSpan 不是基于 Range 的索引器,以避免创建不必要的数据副本。...若要使用它,请将光标置于数组冲突上,然后按 Ctrl+。 (句点)。 从显示的选项列表中选择“对字符串使用 AsSpan 不是基于范围的索引器”。...不是基于范围的索引器来获取数组的 ReadOnlySpan 或 ReadOnlyMemory 部分 CA1833:使用 AsSpan 或 AsMemory 不是基于范围的索引器来获取数组的 Span

1K00

calendar:Python日历的处理与生成

具体用法如下所示: import calendar c = calendar.TextCalendar(calendar.MONDAY) c.prmonth(2020, 4) 运行之后,我们会得到一个日历字符串形式数据...HTMLCalendar().formatmonth 这里,我们直接替换掉上面的c.prmonth()。...(2020,4)) 运行之后,我们会得到如下结果: 这里,我们会直接返回HTML表格定义的日历格式。...在使用Django开发时,这个方法非常好用。而且,细心的读者肯定看到了这里每一个标签都有class,在实际的使用中,可以通过CSS丰富这个日历的样式。...这在中文网页中是不是显示的非常不友好。没关系,我们可以使用本地化环境函数LocaleTextCalendar或LocaleHTMLCalendar实现中文日历的显示

26320

高质量编码-考勤记录日历可视化

图片如果使用日历来展示考勤历史岂不是更直观形象。于是使用考勤系统页面里的API,由于考勤页面是后台生成的HTML,需要使用SOUP库解析JSON。开发的考勤图表页面。...支持原考勤登录验证,选择月份,日历显示上午未打卡或下午未打卡,以及周末加班打卡。图片图片图片后台使用Python语言开发,requests库访问考勤系统API,flask作为Web框架。...list(calendar.month_name)[1:]words2="一,二,三,四,五,六,日,一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月".split(',')htmlCalendar...=calendar.HTMLCalendar()def getData(ID,year,month,cookies): req=requests.get(url,params={'ID':ID... 使用时保持登录OA HR平台,日历显示红色表示上午或下午未打卡

89020

Django搭建blog网站(一)

可以看到 all 方法都返回了数据,这些数据应该是我们之前存进去的,但是显示字符串有点奇怪,无法看出究竟是不是我们之前存入的数据。...和端口号 8000 去掉,此时只剩下一个空字符串 r'^$' 的模式正是匹配一个空字符串(这个正则表达式的意思是以空字符串开头且以空字符串结尾),于是二者匹配,Django 便会调用其对应的 views.index...如图所示,你会看到首页显示的样式非常混乱,原因是浏览器无法正确加载 CSS 等样式文件。需要以 Django 的方式来正确地处理 CSS 和 JavaScript 等静态文件的加载路径。...而这里我们使用的模板标签的功能则类似于函数,例如这里的 static 模板标签,它把跟在后面的字符串 'css/bootstrap.min.css' 转换成正确的文件引入路径。...,但是 Django 出于安全方面的考虑,任何的 HTML 代码在 Django 的模板中都会被转义(即显示原始的 HTML 代码,不是经浏览器渲染后的格式)。

5.7K91

Django 博客首页视图

和端口号 8000 去掉,此时只剩下一个空字符串 r'^$' 的模式正是匹配一个空字符串(这个正则表达式的意思是以空字符串开头且以空字符串结尾),于是二者匹配,Django 便会调用其对应的 views.index...我们看到在视图函数里返回的是一个 HttpResponse 类的实例,我们给它传入了一个希望显示在用户浏览器上的字符串。但是我们的博客不可能只显示这么一句话,它有可能会显示很长很长的内容。...再一次强调 templates\ 目录位于项目根目录, index.html 位于 templates\blog 目录下,不是 blog 应用下,如果弄错了你可能会得到一个TemplateDoesNotExist...如果遇到这个异常,请回来检查一下模板目录结构是否正确。 在 templates\blog\index.html 文件里写入下面的代码: <!...最终,我们的 HTML 模板中的内容字符串被传递给 HttpResponse 对象并返回给浏览器(Django 在 render 函数里隐式地帮我们完成了这个过程),这样用户的浏览器上便显示出了我们写的

1.2K50

django 1.8 官方文档翻译: 1-2-3 编写你的第一个Django应用,第3部分

评论功能 – 一篇给定博客发表评论。 在我们的 poll 应用程序中,将有以下四个视图: Poll “index” 页 – 显示最新发布的民意调查。...投票功能 – 一项给定的民意调查处理投票选项。 在 Django 中,网页及其他内容是由视图来展现的。每个视图就是一个简单的 Python 函数(或方法, 对于基于类的视图情况下)。...请注意 include() 中的正则表达式没有 $ (字符串结尾的匹配符 match character) 尾部是一个反斜杠。...哲理 为什么我们要使用一个 get_object_or_404() 辅助函数 不是在更高级别自动捕获 ObjectDoesNotExist 异常, 或者由模型 API 抛出 Http404 异常不是...比如说,polls 应用有一个 detail 视图,可能会在同一个项目中是一个博客应用的视图。Django 是如何知道 使用 {% url %} 模板标记创建应用的 url 时选择正确呢?

1.8K50

真正的 Django 博客首页视图

而这里我们使用的模板标签的功能则类似于函数,例如这里的 static 模板标签,它把跟在后面的字符串 'css/bootstrap.min.css' 转换成正确的文件引入路径。...这样 css 和 js 文件才能被正确加载,样式才能正常显示。 为了能在模板中使用 {% static %} 模板标签,别忘了在最顶部 {% load staticfiles %} 。...,因为这里的引用的文件是一个外部文件,不是我们项目里 static\blog\css\ 目录下的文件,因此无需使用模板标签。...{% empty %} 的作用是当 post_list 空,即数据库里没有文章时显示 {% empty %} 下面的内容,最后我们用 {% endfor %} 告诉 Django 循环在这里结束了。...例如这里的 {{ post.pk }}(pk 是 primary key 的缩写,即 post 对应于数据库中记录的 id 值,该属性尽管我们没有显示定义,但是 Django 会自动我们添加)。

3.5K80

使用Django输出CSV

这篇文档阐述了如何通过使用Django视图动态输出CSV (Comma Separated Values)。 你可以使用Python CSV 库或者Django的模板系统来达到目的。...这会告诉浏览器,文档是个CSV文件不是HTML文件。如果你把它去掉,浏览器可能会把输出解释HTML,会在浏览器窗口中显示一篇丑陋的、可怕的官样文章。...CSV模板会为你处理引用,所以你不用担心没有转义字符串中的引号或者逗号。只需要向writerow()传递你的原始字符串,它就会执行正确的操作。...由于Django在内部使用Unicode,这意味着从一些来源比如HttpRequest读出来的字符串可能导致潜在的问题。有一些选项用于处理它: 手动将所有Unicode对象编码兼容的编码。...,不是CSV模块。

88130

django 1.8 官方文档翻译: 3-5-1 使用Django输出CSV

使用Django输出CSV 这篇文档阐述了如何通过使用Django视图动态输出CSV (Comma Separated Values)。...这会告诉浏览器,文档是个CSV文件不是HTML文件。如果你把它去掉,浏览器可能会把输出解释HTML,会在浏览器窗口中显示一篇丑陋的、可怕的官样文章。...CSV模板会为你处理引用,所以你不用担心没有转义字符串中的引号或者逗号。只需要向writerow()传递你的原始字符串,它就会执行正确的操作。...由于Django在内部使用Unicode,这意味着从一些来源比如HttpRequest读出来的字符串可能导致潜在的问题。有一些选项用于处理它: 手动将所有Unicode对象编码兼容的编码。...,不是CSV模块。

74530

django 1.8 官方文档翻译: 1-2-2 编写你的第一个Django应用,第2部分

Django 解决了网站管理员创建统一 的管理界面用以编辑内容的问题。 管理界面不是让网站访问者使用的。它是网站管理员准备的。...如果看到这,不是上面的登录界面,那你应该得到一个类似如下所示的错误页面报告: ImportError at /admin/ cannot import name patterns ... > 那么你很可能使用的...使用了 TabularInline 后(不是 StackedInline) ,基于表的格式下相关 对象被显示的更紧凑了: 需要注意的是有个额外的 “Delete?”...我们的 poll 应用不是很复杂并不需要自定义管理模板。但是如果它变得更复杂 而且为了一些功能需要修改 Django 的标准管理模板,修改应用模板将是更 明智的选择,不是修改项目模板。...这个变量包含了每一个 已安装的 Django 应用。你可以通过你认为最好的方法硬编码链接到特定对象的管理页面,不是使用默认模板。

2.5K40

关于“Python”的核心知识点整理大全53

从输出可 知,主题Chess的ID1,Rock Climbing的ID2。 知道对象的ID后,就可获取该对象并查看其任何属性。...编写用户可请求的网页时,我们将使用这种语法。确认代码能获取所需的数据时,shell很有 帮助。如果代码在shell中的行为符合预期,那么它们在项目文件中也能正确地工作。...其中的r让Python将接下来的字符串视为原始字符串引号 告诉Python正则表达式始于和终于何处。脱字符(^)让Python查看字符串的开头,美元符号让 Python查看字符串的末尾。...现在,如果你请求这个项目的基础URL——http://localhost:8000/,将看到刚才创建的网页, 不是默认的Django网页。...Django接受请求的URL,发现该URL与模式r'^$'匹配,因此调用函 数views.index(),这将使用index.html包含的模板来渲染网页,结果如图18-3所示。

9910

Python 项目实践三(Web应用程序)第二篇

当前, 基础URL(http://localhost:8000/)返回默认的Django网站,让我们知道正确地建立了项目。我们将修改这一点,将这个基础URL映射到“学习笔记”的主页。...Django在urlpatterns中查找与请求的URL字符串匹配的正则表达式,因此正则表达式定义了Django可查找的模式。 url()的第二个实参指定了要调用的视图函数。...每当需要提供到这个主页的链接时,我们都将使用这个名称,不编写URL。... 如果你请求这个项目的基础URL——http://localhost:8000/,将看到刚才创建的网页,不是默认的Django网页。...Django接受请求的URL,发现该URL与模式r'^$'匹配,因此调用函数views.index(),这将使用index.html包含的模板来渲染网页,结果如图: ?

1.4K100

37.Django1.11.6文档

如果不需要额外的转义,您将需要使用mark_safe(),如果您绝对确保您的代码不包含XSS漏洞。 要建立小型HTML片段,强烈建议您使用format_html()不是mark_safe()。...如果该字段True 或NullBooleanField,Django显示漂亮的"on"或"off"图标不是BooleanField 或False。...如果要使用内联模型来表示多对多关系,则必须告知Django的管理员不是显示此窗口小部件 - 否则您最终会在管理页面上看到两个窗口小部件,用于管理关系。...建议您使用get_change_message()方法检索该值,不是直接访问该值。 在Django更改1.10: 以前,此属性始终是一个简单的字符串。 ...会话对象指南 在request.session 上使用普通的Python 字符串作为字典的键。 这主要是为了方便不是一条必须遵守的规则。

24.3K80

Django 3.1 官网学习路线

Django 编写的每个应用程序都由一个遵循特定约定的 Python 包组成。Django 附带一个工具,它可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码,不是创建目录。...如前所述,默认应用程序是常见情况包含的,但不是每个人都需要它们。如果您不需要它们中的任何一个或全部,那么可以在运行 migrate 之前随意地注释或删除 INSTALLED_APPS 中的适当行。...要调用 Python Shell,请使用以下命令: python manage.py shell 我们使用它,不是简单地输入“python”,因为 manager .py 设置了 DJANGO_SETTINGS_MODULE...使用timezone.now () #不是date .date .now(),它将做正确的事情 In [3]: from django.utils import timezone In [4]: q...使用表格内联(不是 StackedInline),相关对象将以更紧凑的、基于表格的格式显示: 自定义管理员更改列表 现在问题管理页面看起来不错了,让我们对“更改列表”页面做一些调整——这个页面显示系统中的所有问题

8.2K10

【Python全栈100天学习笔记】Day45 Cookie和Session介绍及使用

在默认情况下,Django将session的数据序列化后保存在关系型数据库中,在Django 1.6以后的版本中,默认的序列化数据的方式是JSON序列化,而在此之前一直使用Pickle序列化。...还有一点需要说明的是,使用关系型数据库保存session中的数据在大多数时候并不是最好的选择,因为数据库可能会承受巨大的压力而成为系统性能的瓶颈,在后面的章节中我们会告诉大家如何将session的数据保存到缓存服务中...session中,稍后用户登录时,我们要将保存在session中的验证码字符串和用户输入的验证码字符串进行比对,如果用户输入了正确的验证码才能够执行后续的登录流程,代码如下所示。...python manage.py clearsessions Django框架默认的session过期时间两周(1209600秒),如果想修改这个时间,可以在项目的配置文件中添加如下所示的代码。...需要说明的是,这里所说的密钥就是我们在Django项目配置文件中指定的SECRET_KEY,盐是程序中设定的一个字符串,你愿意设定为什么都可以,只要是一个有效的字符串

83630
领券