考虑以下调查问题:
你喜欢这个问题吗? (选择一个)
- 是
- 不,因为
- 我不喜欢它的格式化
- 我不喜欢措辞
- 其他原因:...................
- 其他回应(请注明)......................
我试图代表一系列问题,其中一些问题就是这样。有些更简单(只是一个选择列表)。但是我试图用Django以及它自己的表单方式解决这个问题。我们有以下问题:
我们需要服务器端验证。只能指定一个选项。在上述“其他”选择的情况下,那些需要后续的charfield。
我们需要将charfield挤入选项中!我很确定我可以通过模板破解这些内容但请记住这一点。
只是为了使事情复杂化,问题及其答案需要可编辑。我已经使用YAML完成了这项工作并且生成了表单,这样可以正常工作。
那么破解Django表单系统以允许我这样做的最佳方法是什么?我应该打扰django.forms
还是只写一些以自己的方式完成所有事情的东西? 你如何做到这一点?
答案 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()方法中的数据字段