当前位置: 首页 > 编程笔记 >

Django 复合小部件

彭衡
2023-03-14
本文向大家介绍Django 复合小部件,包括了Django 复合小部件的使用技巧和注意事项,需要的朋友参考一下

示例

您可以使用创建包含多个小部件的小部件MultiWidget。

from datetime import date

from django.forms.widgets import MultiWidget, Select
from django.utils.dates import MONTHS

class SelectMonthDateWidget(MultiWidget):
    """This widget allows the user to fill in a month and a year.

    This represents the first day of this month or, if `last_day=True`, the
    last day of this month.
    """

    default_nb_years = 10

    def __init__(self, attrs=None, years=None, months=None, last_day=False):
       self.last_day= last_day

        if not years:
            this_year = date.today().year
            years = range(this_year, this_year + self.default_nb_years)
        if not months:
            months = MONTHS

        # Here we will use two `Select` widgets, one for months and one for years
        widgets = (Select(attrs=attrs, choices=months.items()),
                   Select(attrs=attrs, choices=((y, y) for y in years)))
        super().__init__(widgets, attrs)

    def format_output(self, rendered_widgets):
        """Concatenates rendered sub-widgets as HTML"""
        return (
            '<div class="row">'
            '<div class="col-xs-6">{}</div>'
            '<div class="col-xs-6">{}</div>'
            '</div>'
        ).format(*rendered_widgets)

    def decompress(self, value):
        """Split the widget value into subwidgets values.
        We expect value to be a valid date formated as `%Y-%m-%d`.
        We extract month and year parts from this string.
        """
        if value:
            value = date(*map(int, value.split('-')))
            return [value.month, value.year]
        return [None, None]

    def value_from_datadict(self, data, files, name):
        """Get the value according to provided `data` (often from `request.POST`)
        and `files` (often from `request.FILES`, not used here)
        `name` is the name of the form field.

        As this is a composite widget, we will grab multiple keys from `data`.
        Namely: `field_name_0` (the month) and `field_name_1` (the year).
        """
        datalist = [
            widget.value_from_datadict(data, files, '{}_{}'.format(name, i))
            for i, widget in enumerate(self.widgets)]
        try:
            # Try to convert it as the first day of a month.
            d = date(day=1, month=int(datelist[0]), year=int(datelist[1]))
            if self.last_day:
                # Transform it to the last day of the month if needed
                ifd.month== 12:
                    d = d.replace(day=31)
                else:
                    d = d.replace(month=d.month+1) - timedelta(days=1)
        except (ValueError, TypeError):
            # If we failed to recognize a valid date
            return ''
        else:
            # Convert it back to a string with format `%Y-%m-%d`
            return str(d)
           

 类似资料:
  • 问题内容: Django管理站点使用了一个非常酷的小部件: 如何在自己的应用程序中使用此小部件?我看不到这里列出的任何东西。 问题答案: Django Admin应用程序为日历,过滤的选择等定义了许多自定义的小部件。这些小部件定义了媒体要求,并且Django Admin使用自定义小部件代替Django默认值。管理模板将仅包括在任何给定页面上呈现窗口小部件所需的那些媒体文件。 如果你喜欢Django

  • 问题内容: 我是django的新人。 我想创建一个自定义窗口小部件。 forms.py: widget.py: project / widgets / filter.html: 但是它不会呈现新模板,而是仍然呈现旧方法。 你能给我一些提示吗? 问题答案: Django版本 <1.11: 小部件必须实现该方法才能呈现不同的模板: Django 1.11版: 在渲染器的文档中,我们可以找到以下内容:

  • 问题内容: 我有一个具有复合主键的旧式数据库表。我认为我无法更改结构以包含代理键,因为编写了一些使用该表的代码。在django中,我无法使用该表,因为它没有主键(非复合键)。 Django模型是否支持复合主键?如果不是,是否有任何解决方法而不更改表的结构? PS我正在使用PostgreSQL。 问题答案: 试试下面类似的代码: 或者,如果你只想要唯一的混合字段: 编辑:我想指出,如果有3列,则此方

  • 本文向大家介绍Django 简单文本输入小部件,包括了Django 简单文本输入小部件的使用技巧和注意事项,需要的朋友参考一下 示例 小部件最简单的示例是自定义文本输入。例如,要创建一个<input type="tel">,您必须继承TextInput并设置input_type为'tel'。            

  • “复杂小部件”允许用户与应用程序进行高级交互功能。 每个Complex小部件都从Widget类继承属性,Widget类继承UIObject的属性。 Sr.No. 小部件和描述 1 GWT UIObject类 此窗口小部件包含文本,不使用元素解释为HTML,从而使其以块布局显示。 2 GWT Widget类 此窗口小部件可以包含HTML文本,并使用元素显示html内容,使其以块布局显示。 复杂小部件

  • 问题内容: 我很难找到有关如何编写自定义窗口小部件的文档。 我的问题是: 如果我构建了一个自定义窗口小部件,可以将其等效地用于管理界面或正常形式吗? 如果我想允许用户编辑项目列表,我应该继承什么小部件?我需要重写/实现小部件的哪些方法? 哪种窗口小部件方法负责从用户输入返回到数据模型? 问题答案: 你是对的,Django没有提供有关此特定主题的文档。我建议你查看中的内置小部件django.form