1

次のアンケートの質問を検討してください。

この質問は好きですか?(いずれかを選択)

  • はい
  • いいえ、なぜなら
    • フォーマットが気に入らない
    • 言葉遣いが気に入らない
    • 他の理由: ...................
  • その他の回答(具体的に記入してください).................................

私は一連の質問を表現しようとしていますが、そのうちのいくつかはそのようなものです. より単純なものもあります (単なる選択肢のリスト)。しかし、これを Django と独自のフォームのやり方で解決しようとすると、いくつかの問題が発生します。次の問題があります。

  • サーバー側の検証が必要です。指定できる選択肢は 1 つだけです。上記の「その他」の選択肢の場合、それらにはフォローアップの charfield が必要です。

  • charfield をオプションに絞り込む必要があります! テンプレートを介してこれらをハッキングできると確信していますが、それを覚えておいてください.

  • さらに複雑なことに、質問とその回答を編集可能にする必要があります。私はすでにYAMLでこれを行っており、フォームを生成するところまではうまくいきます.

では、これを可能にするために Django フォーム システムをハックする最善の方法は何でしょうか? 気にする必要がdjango.formsありますか、それともすべてを独自の方法で行うものを書くだけですか? これをどのよう行いますか?

4

2 に答える 2

1

フォームの扱いを避けたい場合は、jquery の $.ajax() メソッドを使用することをお勧めします。基本的には、空白のフォーム モデルを作成して POST をキャッチするだけで、データを取得して目的の処理を実行できます。次に例を示します。

#models.py
class BlankForm(forms.Form):    

    def __unicode__(self):
        return "BlankForm"

#views.py
def my_view(request):

    if request.method == 'POST':
        if 'answer' in request.POST:
            form = BlankForm(request.POST)

            if form.is_valid():
                foo = request.POST.__getitem__('add')
                bar = request.POST.__getitem__('bar')
                baz = request.POST.__getitem__('baz')
                #Do stuff with your data:
                return HttpResponse('ok')

次に、Webページで次のようなことができます。

<script type="text/javascript">

        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }

        function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }

        var csrftoken = getCookie('csrftoken');

        $.ajaxSetup({
            crossDomain: false, // obviates need for sameOrigin test
                beforeSend: function(xhr, settings) {
                    if (!csrfSafeMethod(settings.type)) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });

        $.ajax({
            type: 'POST',
            data: {
                'answer': true,
                'foo': foo,
                'bar': bar,
                'baz': baz
            },
            dataType: 'application/json'
        });
    }

</script>

Cookie と CSRF トークンに関するすべてのものは、django の CSRF 保護システムに関係しています。基本的に、心配する必要があるのは、 $.ajax() メソッドの Data フィールドを編集することだけです

于 2012-09-18T18:26:50.773 に答える
0

さまざまなオプションはForeignKey、応答を含む別のテーブルになります。メインの回答とサブの回答の両方を保持するには、その FK に複数のフィールドが必要であり、適切に再グループ化 (または明示的な順序が必要な場合は順序を変更) する必要があります。CharField「その他」の応答を保持するには、も必要です。両方のフィールドをカスタム フィールドにカプセル化し、カスタム ウィジェットを使用してコントロールをフォームに表示するのが最も簡単な場合があります。

于 2012-09-18T16:00:29.283 に答える