0

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)

しかし、ここにあるのは、結果として得られた、admin を介して設定されたモデルです。

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へのデータの処理はどういうわけかめちゃくちゃになっています。洞察をいただければ幸いです!

4

3 に答える 3

1

残念ながら、Django の POST dict のフィールドの順序に依存することはできません。これは基本的に辞書であるため、順序が設定されていません。

投稿されたデータの順序が重要な場合、Django はrequest.raw_post_dataそれを取得するために用意されています。

于 2013-06-30T19:53:28.537 に答える
-1

これQueryDictは dict 型であるため、任意の順序でキーを返します。

ディクショナリをキーと値のペアの順序付けられていないセットと考えるのが最善です

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

于 2013-06-30T19:35:07.843 に答える