【问题标题】:Can't access all the Values from django MultiWidget, from request.POST?无法从 request.POST 访问 django MultiWidget 的所有值?
【发布时间】:2018-08-01 18:29:57
【问题描述】:

我不确定为什么在发布请求后我无法从 MutliWidget 访问这两个字段。我尝试了各种方法,例如 request.POST.get('name'),它只返回 0 我还尝试访问来自 value_from_datadict(self, data, files, name) 的值,但没有成功。

最让我困惑的是当我使用print(request.POST)时,我可以看到post请求中的表单确实包含MultiWidget的两个值,但是我只能访问一个

例如,当我打印 request.POST 时,它会打印到控制台:

<QueryDict: {'total_travel_time': ['0', '0']}>

但是当我尝试时:request.POST.get('total_travel_time') 我只收到0

这是怎么回事??????这让我有点发疯了。

这是我的 MutliWidget。

class TotalTimeWidget(forms.widgets.MultiWidget):
    CON_STYLE = "margin-left: 0.25in;"
    INPUT_STYLE = "width: .5in; display: inline; " \
                  "vertical-align: top; " \
                  "margin-left: 0.0675in; " \
                  "margin-right: 0.0675in;"
    hour_attrs = dict()
    min_attrs = dict()
    name = ''

    def value_from_datadict(self, data, files, name):
        data = super(TotalTimeWidget, self).value_from_datadict(data, files, name)
        print(data)
        return data

    def decompress(self, value):
        print("decompress_called", value)
        if value:
            return value
        else:
            return ['', '']

    def __init__(self, name, attrs=None, hours=0, minutes=0):
        hour_attrs = {'min': 0, 'max': 12, 'class': "hour", 'value': hours}
        min_attrs = {'min': 0, 'max': 59, 'class': "minute", 'value': minutes}
        self.hour_attrs = hour_attrs
        self.min_attrs = min_attrs
        self.name = name
        _widgets = (
            widgets.NumberInput(attrs=hour_attrs),
            widgets.NumberInput(attrs=min_attrs),
        )
        super(TotalTimeWidget, self).__init__(_widgets, attrs)

    def set_initial(self, **kwargs):
        if 'hours' in kwargs:
            self.hour_attrs['value'] = kwargs['hours']
        if 'minutes' in kwargs:
            self.min_attrs['value'] = kwargs['minutes']

    def render(self, name, value, attrs=None, renderer=None):
        super(TotalTimeWidget, self).render(name, value, attrs, renderer)
        html = '<div style="%(container_style)s"><span>Hours</span>'
        html += '<input type="number" name="%(name)s" min="0" max="99" ' \
                'class="hour" value="%(hour)s" style="%(style)s"' \
                'required id="id_total_hours_%(name)s" />'
        html += '<span>:</span>'
        html += '<input type="number" name="%(name)s" min="0" max="59"' \
                ' class="hour" value="%(min)s" style="%(style)s" ' \
                'required id="id_total_minutes_%(name)s" />'
        html += '<span>Minutes</span></div>'
        html = html % dict(hour=self.hour_attrs['value'],
                           min=self.min_attrs['value'],
                           name=name,
                           container_style=self.CON_STYLE,
                           style=self.INPUT_STYLE)
        return mark_safe(html)

这是我使用 MultiWidget 的字段

class TotalTimeField(forms.MultiValueField):
    def __init__(self, *args, **kwargs):
        hours = 0
        minutes = 0
        if 'hours' in kwargs:
            hours = kwargs['hours']
            del kwargs['hours']
        if 'minutes' in kwargs:
            minutes = kwargs['minutes']
            del kwargs['minutes']
        self.widget = TotalTimeWidget(name='total_time', hours=hours, minutes=minutes)
        list_fields = [
            forms.IntegerField(),
            forms.IntegerField(),
        ]
        super(TotalTimeField, self).__init__(list_fields, *args, **kwargs)

    def compress(self, data_list):
        print('Compress called', data_list)
        if data_list:
            return " ".join(data_list)

这里是视图:

def test_view(request):
    form = ILSTimeAndServiceTrackingForm()
    data = dict()
    data['participant'] = Participant.objects.get_participant_by_id(2)
    if request.POST:
        print(request.POST)
        print(request.POST.get('total_travel_time'))
    data['form'] = form
    return render(request, '../templates/tests/widget_test.html', data)

【问题讨论】:

  • 添加您的查看方法。
  • 我已经用包含的视图更新了我的问题。

标签: python django


【解决方案1】:

多个值有一个特殊的方法:QueryDict.getlist()

尝试更改您的代码:

print(request.POST.get('total_travel_time'))

到:

print(request.POST.getlist('total_travel_time'))

如果有帮助,请告诉我们。


您收到明显错误是因为 QueryDict.__getitem__ or QueryDict.get 的文档说:

如果键有多个值,则返回最后一个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2016-07-03
    • 2021-03-03
    • 2013-12-21
    • 2023-04-05
    相关资源
    最近更新 更多