Поле формы отображается в зависимости от группы лечения - PullRequest
0 голосов
/ 31 октября 2019

Я программирую эксперимент с различными группами лечения. Для групп лечения 3 и 4 я хочу узнать имя участников, используя поле формы. Для контрольной группы и группы обработки 1 - 2 имя не имеет значения, и поэтому не должно быть поля forms_.

Я уже думал об исключении поля формы в HTML с помощью циклов if, поэтому при обработке= 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 %}

Заранее спасибо!

1 Ответ

0 голосов
/ 31 октября 2019

Вы можете изменить подкласс 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')
...