【问题标题】:Formfield displayed based on treatment group基于治疗组显示的表单域
【发布时间】:2020-02-26 19:40:08
【问题描述】:

我正在编写一个包含不同治疗组的实验。对于治疗组 3 和 4,我想通过使用表单字段来了解参与者的姓名。对于对照组和治疗组 1 - 2,名称无关紧要,因此不应该有 forms_field。

我已经考虑使用 if 循环在 HTML 中排除表单字段,因此如果处理 = 3 或 4,则显示该字段。但是,我无法进入其他治疗组的下一页,因为该字段不应为空。插入空白=True 并不是一个真正的选项,因为治疗组 3 和 4 可以跳过名称。我想“强制”治疗组 3 和 4 给我他们的名字。

我的代码太长,这里就不贴了,所以我就贴出相关的段落: 模型视图

class Subsession(BaseSubsession):

    def creating_session(self):
        treatmentgroup = itertools.cycle(['ControlGroup','one','two','three', 'four'])
        for p in self.get_players():
            p.treatmentgroup = next(treatmentgroup)

class Group(BaseGroup):
    pass

class Player(BasePlayer):
    name = models.StringField(label="Your Name:")
    transcribed_text = models.LongStringField()
    levenshtein_distance = models.IntegerField()
    guthaben = models.CurrencyField(initial=c(0))
    cumulative_guthaben = models.CurrencyField()

页面浏览量

class Welcome(Page):
    form_model = 'player'

    def is_displayed(self):
        return self.round_number == 1

class Introduction(Page):
    form_model = 'player'

    def is_displayed(self):
        return self.round_number == 1

class Math(Page):
    form_model = 'player'
    form_fields = ['name']

    def is_displayed(self):
        return self.round_number == 1

    def before_next_page(self):
        if self.round_number == 1:
            self.player.guthaben = self.player.guthaben + Constants.endowment

    def vars_for_template(self):
        return {
            'treatmentgroup': self.player.treatmentgroup,
            'image_path': 'trophy/{}.png'.format(self.round_number)
        }

HTML 页面

{% extends "global/Page.html" %}
{% load otree static %}

{% block title %}
    The math task
{% endblock %}

{% block content %}

<p align="justify"> In case you have any questions, please open the door and wait for the experimenter to come to your cubicle.
</p>

{% if treatmentgroup == 'four' or treatmentgroup == 'three' %}

{% formfields %}

{% endif %}



    {% next_button %}



{% endblock %}

提前致谢!

【问题讨论】:

    标签: python html django form-fields


    【解决方案1】:

    您可以使用 init 方法修改 django.forms 子类。您的代码没有显示表单是如何被实例化的,但在某个地方你会拥有

    form = Form_class() # unbound and
    
    form = Form_class( request.POST ) # bound
    

    如果您不希望显示名称字段,您可以修改这些以传递 hide_name=True

    表单本身将包含方法

    def __init__(self, *args, **kwargs):
        self.hide_name = kwargs.pop('hide_name', False)
        super().__init__(*args, **kwargs)
    

    self.hide_name 可以在表单的任何方法中访问,而 form.hide_name 在呈现它的模板中。为避免验证错误,您可以从表单中删除该字段

        ...
        super().__init__(*args, **kwargs)
        if self.hide_name:
            self.fields.pop('name')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多