【问题标题】:Django Form Ordering is askewDjango Form Ordering 是歪斜的
【发布时间】:2013-06-27 22:42:26
【问题描述】:

我正在尝试使用 django 表单库创建一个表单,但是在查看由表单填充的模型时,这些值是无序的..没有明显的原因。

这是我的看法:

def reoccurring_view(request):
if request.method == 'POST':
    form = ReoccurringForm(request.POST)
    counter = 0
    if form.is_valid():
        for key, value in request.POST.iteritems():
            counter += 1
            if value is not None:
                day = itemize(value, counter)
                add = Reoccurring(day.Day, day.N, day.S, day.E)
                add.save()
else:
    form = ReoccurringForm()
return render(request, 'Reoccurring.html', {'form': form})

这是我的模板:

<form action="" method="post">
        <table>
            {{ form.as_table }}
        </table>
        {% csrf_token %}
        <input class="btn btn-primary" style="float: left;" type="submit" value="Submit">
</form>

这是生成的html表单(注意是按顺序排列的):

Monday:

Tuesday:

Wednesday:

Thursday:

Friday:

Saturday:

Sunday:

这是我的表单类:

class ReoccurringForm(forms.Form):
    monday = forms.CharField(required=False)
    tuesday = forms.CharField(required=False)
    wednesday = forms.CharField(required=False)
    thursday = forms.CharField(required=False)
    friday = forms.CharField(required=False)
    saturday = forms.CharField(required=False)
    sunday = forms.CharField(required=False)

这里是通过管理员生成的填充模型:

1   [u'monday'] [u'06:00 p.m.'] [u'07:30 p.m.']
2   [u'tuesday']    [u'06:00 p.m.'] [u'07:30 p.m.']
3   [u'friday'] [u'06:00 p.m.'] [u'07:30 p.m.']
4   [u'wednesday']  [u'08:30 a.m.'] [u'09:30 a.m.']
5   [u'thursday']   [u'06:00 p.m.'] [u'07:30 p.m.']
6   [u'sunday'] [u'06:00 p.m.'] [u'07:30 p.m.']
7   []  []  []
8   [u'saturday']   [u'06:00 p.m.'] [u'07:30 p.m.']

如您所见...它们出现故障,还有一个不应该存在的额外位置..这是一个错误吗?(编辑:csrf 令牌也被传递到 dict 中,很容易被忽略)但顺序仍然是个谜!

谢谢!

编辑:经过进一步调查,我决定输出 dict 本身并查看它是否损坏,但不知道为什么):

> <QueryDict: {u'monday': [u'monday, 06:00 p.m. to 07:30 p.m.'],
> u'tuesday': [u'tuesday, 06:00 p.m. to 07:30 p.m.'], u'friday':
> [u'friday, 06:00 p.m. to 07:30 p.m.'], u'wednesday': [u''],
> u'thursday': [u'thursday, 06:00 p.m. to 07:30 p.m.'], u'sunday':
> [u'sunday, 06:00 p.m. to 07:30 p.m.'], u'csrfmiddlewaretoken':
> [u'AcxRjdNeTFwij7vwtdplZPy2SRlwrnzl'], u'saturday': [u'saturday, 06:00
> p.m. to 07:30 p.m.']}>

我什至尝试明确设置字段的顺序:

def __init__(self, *args, **kwargs):
        super(ReoccurringForm, self).__init__(*args, **kwargs)
        self.fields.keyOrder = [
            'monday',
            'tuesday',
            'wednesday',
            'thursday',
            'friday',
            'saturday',
            'sunday']

但这没有任何区别......似乎排序是正确的,但是将数据处理到 POST dict 中的过程有点搞砸了,任何见解都将不胜感激!

【问题讨论】:

  • 当表单被渲染或者你正在转储 QueryDict 时,该顺序是错误的?
  • 呈现的形式在原始问题中一直是正确的,我指定并注意到呈现的顺序是正确的。只是 POST 转储不正确。

标签: python django forms http post


【解决方案1】:

Python 字典是无序的。因为 Django 响应是一个字典,所以它的顺序是任意的,不能依赖。

【讨论】:

    【解决方案2】:

    因为QueryDict是dict类型,所以返回的key是任意的。

    最好将字典视为一组无序的键:值 对

    http://docs.python.org/3/tutorial/datastructures.html#dictionaries

    【讨论】:

    • 我尝试了您的解决方案,但它仍然给我上面的混乱 QueryDict ..是的,我正在保存到数据库,但间接地。但是 QueryDict 是直接从 POST 数据中获取的。所以我不确定为什么它不正确。我试图明确排序字段以及您的解决方案,但不知所措。谢谢! (我仍然可能遗漏了一些东西)
    • @user2016117: 你用的是什么版本的 django?
    • 我使用的是 1.5.1,我相信你和其他发帖人误解了我的问题,因为它不是在渲染中,而是在 POST 数据的结果字典的排序中。
    • 是的,我低估了 dicts 的“任意且不可信”的性质(;我的错误!
    • 你为什么编辑你的答案,让 cmets 不再有意义?!
    【解决方案3】:

    恐怕你不能依赖 Django 的 POST dict 中字段的顺序 - 它本质上是一本字典,所以没有设置顺序。

    如果发布数据的顺序很重要,Django 会提供request.raw_post_data 来获取。

    【讨论】:

    • 我很害怕,我想我只是希望通过请求 d 可以神奇地保持 6 个值:您的答案非常完整,但就像其他人阅读本文一样, request.raw_post_data 已弃用,并已替换为 request.body。但是您是正确的,并且已被标记为正确!谢谢!如果有任何其他方法可以获得有序的字典,请告诉我!
    猜你喜欢
    • 2014-07-24
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2011-09-06
    • 2017-05-26
    • 2019-05-03
    相关资源
    最近更新 更多