Javascript oTree/django中的强制滑块
我想用oTree做实验的替代品。为此,我正在寻找一种可能性,在表格I中包括强制性的滑块问题。E您需要移动滑块才能继续下一个问题。首先,我试图修改oTrees以获得一个解决方案供将来使用,但无法将fieldtracker等常用方法集成到项目中 这里是models.py和views.py文件的两个修改版本(但目前在多次失败的尝试后都没有真正起作用),它们给出了我想要去的方向的提示。有没有办法让它发挥作用Javascript oTree/django中的强制滑块,javascript,python,django,otree,Javascript,Python,Django,Otree,我想用oTree做实验的替代品。为此,我正在寻找一种可能性,在表格I中包括强制性的滑块问题。E您需要移动滑块才能继续下一个问题。首先,我试图修改oTrees以获得一个解决方案供将来使用,但无法将fieldtracker等常用方法集成到项目中 这里是models.py和views.py文件的两个修改版本(但目前在多次失败的尝试后都没有真正起作用),它们给出了我想要去的方向的提示。有没有办法让它发挥作用 # -*- coding: utf-8 -*- ## models.py # <st
# -*- coding: utf-8 -*-
## models.py
# <standard imports>
from __future__ import division
from django.db import models
from django_countries.fields import CountryField
from model_utils import FieldTracker,
from otree import widgets
from otree.constants import BaseConstants
from otree.db import models
from otree.models import BaseSubsession, BaseGroup, BasePlayer
class Constants(BaseConstants):
name_in_url = 'survey'
players_per_group = None
num_rounds = 1
class Subsession(BaseSubsession):
pass
class Group(BaseGroup):
pass
class Player(BasePlayer):
def set_payoff(self):
"""Calculate payoff, which is zero for the survey"""
self.payoff = 0
q_country = CountryField(
verbose_name='What is your country of citizenship?')
q_age = IntegerFielder(verbose_name='What is your age?',
min=13, max=125,
initial=25,
widget=widgets.SliderInput())
q_gender = models.CharField(initial=None,
choices=['Male', 'Female'],
verbose_name='What is your gender?',
widget=widgets.RadioSelect())
tracker = FieldTracker()
crt_bat = models.PositiveIntegerField()
crt_widget = models.PositiveIntegerField()
crt_lake = models.PositiveIntegerField()
提前谢谢 默认情况下,
我认为这意味着,如果只删除初始值,它将自我验证
另外,您调用了名为“IntegerField()”的东西。您是指models.IntegerField()还是有我们没有看到的导入?有两种方法可以做到这一点:仅在客户端使用JS,在服务器端使用Django 简单的JS解决方案: 在模板中添加:
{% block scripts %}
<script>
var SliderTouched = false;
var selector = $('[data-slider] input[type="range"]');
selector.change(function() {
SliderTouched = true;
});
$( ".form" ).submit(function( event ) {
if (!SliderTouched){
event.preventDefault();}
});
</script>
{% endblock %}
在views.py
中,除了您的滑块字段外,还将传递此额外字段,以检查滑块是否已更改:
class MyPage(Page):
form_model = models.Player
form_fields = ['q_age', 'checkslider']
def checkslider_error_message(self, value):
if not value:
return 'Please make your decision using slider'
{% block scripts %}
<script>
var selector = $('[data-slider] input[type="range"]');
selector.change(function() {
$('#id_checkslider').val(selector.val());
});
</script>
{% endblock %}
在模板中,将此隐藏的额外字段插入html:
<input type="hidden" name="checkslider" value="" id="id_checkslider"/>
并在滑块更改后立即将此字段设置为当前滑块值:
class MyPage(Page):
form_model = models.Player
form_fields = ['q_age', 'checkslider']
def checkslider_error_message(self, value):
if not value:
return 'Please make your decision using slider'
{% block scripts %}
<script>
var selector = $('[data-slider] input[type="range"]');
selector.change(function() {
$('#id_checkslider').val(selector.val());
});
</script>
{% endblock %}
{%block scripts%}
变量选择器=$('[数据滑块]输入[type=“range”]);
selector.change(函数(){
$('#id_checkslider').val(selector.val());
});
{%endblock%}
我建议对菲利普的答案稍加修改
如果参与者触摸滑块,上面的代码仍然会触发错误消息,但会将滑块返回到默认的起始位置
为了解决这个问题,我使用了以下脚本:
{% block scripts %}
<script>
$('input[name=q_age]').on('input', function(){
$('#id_checkslider').val(1);
});
</script>
{% endblock %}
{%block scripts%}
$('input[name=q_age]')。在('input',function()上{
$('#id_checkslider').val(1);
});
{%endblock%}
触摸滑块时,即使参与者将滑块设置为默认起始位置,代码也会从
checkslider
更改为1
。您的问题是什么?@solarismoke现在澄清了,对不起。