Django表格订购是歪斜的

时间:2013-06-30 19:01:19

标签: python django forms http post

我正在尝试使用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中,很容易被忽略)但订购仍然是一个谜!

谢谢!

编辑:经过进一步调查后,我决定输出字典本身并查看它是否已被破坏,但不知道为什么会这样做:

> <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字典会以某种方式搞砸了,任何洞察都会非常感激!

3 个答案:

答案 0 :(得分:1)

你不能依赖Django的POST字典中的字段顺序我恐怕 - 它本质上是一个字典,因此没有设置排序。

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

这是因为QueryDict是dict类型,所以它以任意顺序返回它的键。

  

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

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