与Django的复杂形式

时间:2012-09-18 15:54:48

标签: django django-forms

考虑以下调查问题:

  

你喜欢这个问题吗? (选择一个)

     
      
  •   
  • 不,因为   
        
    • 我不喜欢它的格式化
    •   
    • 我不喜欢措辞
    •   
    • 其他原因:...................
    •   
  •   
  • 其他回应(请注明)......................
  •   

我试图代表一系列问题,其中一些问题就是这样。有些更简单(只是一个选择列表)。但是我试图用Django以及它自己的表单方式解决这个问题。我们有以下问题:

  • 我们需要服务器端验证。只能指定一个选项。在上述“其他”选择的情况下,那些需要后续的charfield。

  • 我们需要将charfield挤入选项中!我很确定我可以通过模板破解这些内容但请记住这一点。

  • 只是为了使事情复杂化,问题及其答案需要可编辑。我已经使用YAML完成了这项工作并且生成了表单,这样可以正常工作。

那么破解Django表单系统以允许我这样做的最佳方法是什么?我应该打扰django.forms还是只写一些以自己的方式完成所有事情的东西? 如何做到这一点?

2 个答案:

答案 0 :(得分:0)

各种选项将是包含响应的另一个表的ForeignKey。你必须在那个FK中有多个字段来保存主答案和subanswer,你必须重新组合(或重新排序,如果你需要一个明确的顺序)。您还需要CharField才能保留“其他”响应。将两个字段封装在自定义字段中可能最简单,并使用自定义窗口小部件在表单中显示控件。

答案 1 :(得分:0)

如果你想避免处理表单我建议使用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')

然后在你的网页上你可以这样:

<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()方法中的数据字段