Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript oTree/django中的强制滑块_Javascript_Python_Django_Otree - Fatal编程技术网

Javascript oTree/django中的强制滑块

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

我想用oTree做实验的替代品。为此,我正在寻找一种可能性,在表格I中包括强制性的滑块问题。E您需要移动滑块才能继续下一个问题。首先,我试图修改oTrees以获得一个解决方案供将来使用,但无法将fieldtracker等常用方法集成到项目中

这里是models.py和views.py文件的两个修改版本(但目前在多次失败的尝试后都没有真正起作用),它们给出了我想要去的方向的提示。有没有办法让它发挥作用

# -*- 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现在澄清了,对不起。