基于治疗组显示的Formfield

2024-09-27 07:27:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设计一个不同治疗组的实验。对于治疗组3和4,我想通过使用表单字段了解参与者的姓名。对于对照组和治疗组1-2,名称是不相关的,因此不应该有forms_字段

我已经在考虑通过使用if循环排除HTML中的表单字段,因此如果treatment=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 %}

提前谢谢


Tags: selfformnumberforreturnifmodelsdef
1条回答
网友
1楼 · 发布于 2024-09-27 07:27:49

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

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')

相关问题 更多 >

    热门问题