#1 by UlkarQ
I get the error on the title while the code runs smoothly for all other pages. Never had a problem until added progress titles to sliders on the previous page. Could That be the source of the issue? Here is the page: {{ block title }} {{ endblock }} {% block styles %} <style> body { background-color: lightgray; } .container { padding-top: 100px; } .container-x { border: 1px solid #000; padding: 10px; text-align: center; display: flex; flex-direction: row; flex-wrap: wrap; justify-content: center; align-items: center; } .content { margin: -120px 0 20px 0; text-align: center; background-color: lightgray; padding: 10px 25px 10px 25px; text-transform: uppercase; border: 1px solid #000; width: 50%; } </style> {% endblock %} {{ block content }} <div class="container-x"> <div class="content"> <div class="title"> <div class="row text-start"> <div class="col-md-8 offset-md-2"> <h6 class="text-center"><b>Your Previous Offer:</b></h6> <table class="table table-borderless"> <tbody> <thead> <tr> <th></th> <th>Offer</th> <th>Payoff</th> </tr> </thead> <tr> <td><b>Price</b></td> <td>{{ previous_price_offer }}</td> <td>{{ payoff_previous_price }}</td> </tr> <tr> <td><b>License</b></td> <td>{{ previous_license_offer }}</td> <td>{{ payoff_previous_licence }}</td> </tr> <tr> <td><b>Storage</b></td> <td>{{ previous_storage_offer }}</td> <td>{{ payoff_previous_storage }}</td> </tr> <tr> <td><b>Payoff</b></td> <td>{{ step_payoff }}</td> </tr> </tbody> </table> </div> </div> </div> </div> <div class="row"> <div class="col-md-12"> <h6><b>Your counterpart’s Offer:</b></h6> </div> <div class="col-md-12"> <p class="text-start"> <i>I can offer you a price of $110, 8 years of LCD and 7 GB.</i> </p> </div> <div class="col-md-4 text-start"> <table class="table"> <tbody> <thead> <tr> <th></th> <th>Offer</th> <th>Payoff</th> </tr> </thead> <tr> <td><b>Price:</b></td> <td>$110</strong></td> <td>10</strong></td> </tr> <tr> <td><b>License:</b></td> <td>8Years</strong></td> <td>6</strong></td> </tr> <tr> <td><b>Storage</b></td> <td>7GB</strong></td> <td>6</strong></td> </tr> <tr> <td><b>Counterpart's Concession</b></td> <td></td> <td>22</strong></td> </tr> <tr> <td><b>Your Total Payoff</b></td> <td></td> <td>22</strong></td> </tr> </tbody> </table> </div> <div class="col-md-12"> <div class="row"> <div class="col-md-12"> <div> <div class="col-md-12"> <div class="row"> <div class="col-md-3"> <button name="offer_5_accept" value="True" class="btn" style="border: 2px solid black;"> <b>Accept the Offer</b> </button> </div> <div class="col-md-3"> <button name="offer_5_counteroffer" value="True" class="btn" style="border: 2px solid black;"> <b>Make Counteroffer</b> </button> </div> <div class="col-md-3"> <button name="offer_5_end_negotiation" value="True" class="btn" style="border: 2px solid black;"> <b>End Negotiation</b> </button> </div> </div> </div> </div> </div> </div> </div> </div> </div> {{ endblock }} The init.py: from otree.api import * doc = """ Your app description """ class C(BaseConstants): NAME_IN_URL = 'HL' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 PRICE_CHOICES = [ ("$150", "$150"), ("$145", "$145"), ("$140", "$140"), ("$135", "$135"), ("$130", "$130"), ("$125", "$125"), ("$120", "$120"), ("$115", "$115"), ("$110", "$110"), ("$105", "$105"), ("$100", "$100") ] LICENSE_CHOICES = [ ("0 Years", "0 Years"), ("1 Year", "1 Year"), ("2 Years", "2 Years"), ("3 Years", "3 Years"), ("4 Years", "4 Years"), ("5 Years", "5 Years"), ("6 Years", "6 Years"), ("7 Years", "7 Years"), ("8 Years", "8 Years"), ("9 Years", "9 Years"), ("10 Years", "10 Years") ] STORAGE_CHOICES = [ ("0 GB", "0 GB"), ("1 GB", "1 GB"), ("2 GB", "2 GB"), ("3 GB", "3 GB"), ("4 GB", "4 GB"), ("5 GB", "5 GB"), ("6 GB", "6 GB"), ("7 GB", "7 GB"), ("8 GB", "8 GB"), ("9 GB", "9 GB"), ("10 GB", "10 GB") ] PAYOFFS_DICT = { "price": { PRICE_CHOICES[0][0]: 50, PRICE_CHOICES[1][0]: 45, PRICE_CHOICES[2][0]: 40, PRICE_CHOICES[3][0]: 35, PRICE_CHOICES[4][0]: 30, PRICE_CHOICES[5][0]: 25, PRICE_CHOICES[6][0]: 20, PRICE_CHOICES[7][0]: 15, PRICE_CHOICES[8][0]: 10, PRICE_CHOICES[9][0]: 5, PRICE_CHOICES[10][0]: 0 }, "license": { LICENSE_CHOICES[0][0]: 30, LICENSE_CHOICES[1][0]: 27, LICENSE_CHOICES[2][0]: 24, LICENSE_CHOICES[3][0]: 21, LICENSE_CHOICES[4][0]: 18, LICENSE_CHOICES[5][0]: 15, LICENSE_CHOICES[6][0]: 12, LICENSE_CHOICES[7][0]: 9, LICENSE_CHOICES[8][0]: 6, LICENSE_CHOICES[9][0]: 3, LICENSE_CHOICES[10][0]: 0, }, "storage": { STORAGE_CHOICES[0][0]: 20, STORAGE_CHOICES[1][0]: 18, STORAGE_CHOICES[2][0]: 16, STORAGE_CHOICES[3][0]: 14, STORAGE_CHOICES[4][0]: 12, STORAGE_CHOICES[5][0]: 10, STORAGE_CHOICES[6][0]: 8, STORAGE_CHOICES[7][0]: 6, STORAGE_CHOICES[8][0]: 4, STORAGE_CHOICES[9][0]: 2, STORAGE_CHOICES[10][0]: 0, } } class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): nickname = models.StringField( verbose_name="" ) i_achieve1 = models.IntegerField( verbose_name="", min=0, max=100, ) cp_achieve1 = models.IntegerField( verbose_name="", min=0, max=100, ) i_achieve2 = models.IntegerField( verbose_name="", min=0, max=100, ) cp_achieve2 = models.IntegerField( verbose_name="", min=0, max=100, ) IQ1 = models.IntegerField( label='', widget=widgets.RadioSelect(), choices=[ [1, '… mostly distributive with little options for trade-offs.'], [2, '… mostly integrative with options for trade-offs.'], ] ) IQ2 = models.IntegerField( label='', widget=widgets.RadioSelect(), choices=[ [1, '… the buyer, and a low price with high licence contract duration, and online storage is advantageous.'], [2, '… the seller, and a high price with low licence contract duration, and online storage is advantageous.'], ] ) IQ3 = models.IntegerField( label='', widget=widgets.RadioSelect(), choices=[ [1, 'The Hard RL is 0 payoff points.'], [2, 'The Hard RL is 10 payoff points.'], [3, 'The Hard RL is 20 payoff points.'], ] ) IQ4 = models.IntegerField( label='', widget=widgets.RadioSelect(), choices=[ [1, 'The Soft RL is 25 payoff points.'], [2, 'The Soft RL is 35 payoff points.'], [3, 'The Soft RL is 45 payoff points.'], ] ) # ***********OFFER 0******************* offer_0_accept = models.BooleanField( blank=True, initial=False ) offer_0_counteroffer = models.BooleanField( blank=True, initial=False ) offer_0_end_negotiation = models.BooleanField( blank=True, initial=False ) message_offer_0 = models.LongStringField( verbose_name="", blank=True ) price_offer_0 = models.StringField( label='Price', widget=widgets.RadioSelect(), choices=C.PRICE_CHOICES ) license_offer_0 = models.StringField( label='Licence', widget=widgets.RadioSelect(), choices=C.LICENSE_CHOICES ) storage_offer_0 = models.StringField( label='Storage', widget=widgets.RadioSelect(), choices=C.STORAGE_CHOICES ) # ***********OFFER 1******************* offer_1_accept = models.BooleanField( blank=True, initial=False ) offer_1_counteroffer = models.BooleanField( blank=True, initial=False ) offer_1_end_negotiation = models.BooleanField( blank=True, initial=False ) message_offer_1 = models.LongStringField( verbose_name="", blank=True ) price_offer_1 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.PRICE_CHOICES ) license_offer_1 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.LICENSE_CHOICES ) storage_offer_1 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.STORAGE_CHOICES ) # ***********OFFER 2******************* offer_2_accept = models.BooleanField( blank=True, initial=False ) offer_2_counteroffer = models.BooleanField( blank=True, initial=False ) offer_2_end_negotiation = models.BooleanField( blank=True, initial=False ) message_offer_2 = models.LongStringField( verbose_name="", blank=True ) price_offer_2 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.PRICE_CHOICES ) license_offer_2 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.LICENSE_CHOICES ) storage_offer_2 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.STORAGE_CHOICES ) # ***********OFFER 3******************* offer_3_accept = models.BooleanField( blank=True, initial=False ) offer_3_counteroffer = models.BooleanField( blank=True, initial=False ) offer_3_end_negotiation = models.BooleanField( blank=True, initial=False ) message_offer_3 = models.LongStringField( verbose_name="", blank=True ) price_offer_3 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.PRICE_CHOICES ) license_offer_3 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.LICENSE_CHOICES ) storage_offer_3 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.STORAGE_CHOICES ) # ***********OFFER 4******************* offer_4_accept = models.BooleanField( blank=True, initial=False ) offer_4_counteroffer = models.BooleanField( blank=True, initial=False ) offer_4_end_negotiation = models.BooleanField( blank=True, initial=False ) message_offer_4 = models.LongStringField( verbose_name="", blank=True ) price_offer_4 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.PRICE_CHOICES ) license_offer_4 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.LICENSE_CHOICES ) storage_offer_4 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.STORAGE_CHOICES ) own_achievement = models.IntegerField( verbose_name="", min=0, max=100 ) counterpart_achievement = models.IntegerField( verbose_name="", max=100 ) Coop_Slider=models.IntegerField(min=0) Fair_Slider=models.IntegerField(min=0) Trust_Slider=models.IntegerField(min=0) Weak_Slider=models.IntegerField(min=0) Satisfy_Slider=models.IntegerField(min=0) LongT_Slider=models.IntegerField(min=0) # ***********OFFER 5******************* offer_5_accept = models.BooleanField( blank=True, initial=False ) offer_5_counteroffer = models.BooleanField( blank=True, initial=False ) offer_5_end_negotiation = models.BooleanField( blank=True, initial=False ) message_offer_5 = models.LongStringField( verbose_name="", blank=True ) price_offer_5 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.PRICE_CHOICES ) license_offer_5 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.LICENSE_CHOICES ) storage_offer_5 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.STORAGE_CHOICES ) # ***********OFFER 6******************* offer_6_accept = models.BooleanField( blank=True, initial=False ) offer_6_counteroffer = models.BooleanField( blank=True, initial=False ) offer_6_end_negotiation = models.BooleanField( blank=True, initial=False ) message_offer_6 = models.LongStringField( verbose_name="", blank=True ) price_offer_6 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.PRICE_CHOICES ) license_offer_6 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.LICENSE_CHOICES ) storage_offer_6 = models.StringField( verbose_name="", widget=widgets.RadioSelect(), choices=C.STORAGE_CHOICES ) FinalMessageS = models.LongStringField( verbose_name="", blank=True ) age = models.IntegerField( label='', min=18, max=99 ) sex = models.IntegerField( label='', widget=widgets.RadioSelect(), choices=[ [1, 'Female'], [2, 'Male'], [3, 'Other'] ] ) discipline = models.IntegerField( label='', widget=widgets.RadioSelect(), choices=[ [1, 'Social Sciences'], [2, 'Natural Sciences'], [3, 'Art, Letter and Languages'], [4, 'Technical Sciences'], [6, 'Medicine'], [7, 'Business'], [8, 'Other'] ] ) degree = models.IntegerField( label='', widget=widgets.RadioSelect(), choices=[ [1, 'BA'], [2, 'BSc'], [3, 'MA'], [4, 'MSc'], [5, 'Other'] ] ) # ***************Payoff**************** payoff_0 = models.IntegerField(initial=10) payoff_1 = models.IntegerField(initial=0) payoff_2 = models.IntegerField(initial=0) payoff_3 = models.IntegerField(initial=0) payoff_4 = models.IntegerField(initial=0) payoff_5 = models.IntegerField(initial=0) payoff_6 = models.IntegerField(initial=0) total_payoff = models.IntegerField() Coop = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Agree = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Compr = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Accomm = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Oblig = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Fair = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Reason = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Just = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Self = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Soft = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Weak = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Compl = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Yield = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Honest = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Real = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Plaus = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) Sinc = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q1 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q2 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q3 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q4 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q5 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q6 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q7 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q8 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q9 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q10 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q11 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q12 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q13 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q14 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q15 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) q16 = models.IntegerField( widget=widgets.RadioSelect, choices=[1, 2, 3, 4, 6, 6, 7] ) # PAGES class Intro(Page): pass class Nickname(Page): form_model = 'player' form_fields = ["nickname"] class Expectations(Page): form_model = 'player' form_fields = ["i_achieve1", "cp_achieve1"] class InitialQuest(Page): form_model = 'player' form_fields = ['IQ1', 'IQ2', 'IQ3', 'IQ4'] @staticmethod def error_message(player: Player, values): solutions = dict(IQ1=1, IQ2=2,IQ3=2,IQ4=2) if values != solutions: return "One or more answers were incorrect." class WhoStartsFirst(Page): timeout_seconds = 5 class WhoStartsFirstWaiting(Page): timeout_seconds = 5 class Step0OpeningOC(Page): form_model = 'player' form_fields = ["offer_0_accept", "offer_0_counteroffer", "offer_0_end_negotiation"] class Step0CounterOS(Page): form_model = 'player' form_fields = ['message_offer_0', 'price_offer_0', 'license_offer_0', 'storage_offer_0'] @staticmethod def is_displayed(player: Player): return player.offer_0_counteroffer class WaitingScreen1(Page): timeout_seconds = 5 @staticmethod def is_displayed(player: Player): return player.offer_0_counteroffer class Step1COC(Page): form_model = 'player' form_fields = ["offer_1_accept", "offer_1_counteroffer", "offer_1_end_negotiation"] @staticmethod def is_displayed(player: Player): return player.offer_0_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_0 previous_license_offer = player.license_offer_0 previous_storage_offer = player.storage_offer_0 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_0 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage player.payoff_0 = payoff_0 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_0 ) class Step1COS(Page): form_model = 'player' form_fields = ['message_offer_1', 'price_offer_1', 'license_offer_1', 'storage_offer_1'] @staticmethod def is_displayed(player: Player): return player.offer_1_counteroffer class WaitingScreen2(Page): timeout_seconds = 5 @staticmethod def is_displayed(player: Player): return player.offer_1_counteroffer class Step2COC(Page): form_model = 'player' form_fields = ["offer_2_accept", "offer_2_counteroffer", "offer_2_end_negotiation"] @staticmethod def is_displayed(player: Player): return player.offer_1_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_1 previous_license_offer = player.license_offer_1 previous_storage_offer = player.storage_offer_1 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_1 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage player.payoff_1 = payoff_1 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_1 ) class Step2COS(Page): form_model = 'player' form_fields = ['message_offer_2', 'price_offer_2', 'license_offer_2', 'storage_offer_2'] @staticmethod def is_displayed(player: Player): return player.offer_2_counteroffer class WaitingScreen3(Page): timeout_seconds = 5 @staticmethod def is_displayed(player: Player): return player.offer_2_counteroffer class Step3COC(Page): form_model = 'player' form_fields = ["offer_3_accept", "offer_3_counteroffer", "offer_3_end_negotiation"] @staticmethod def is_displayed(player: Player): return player.offer_2_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_2 previous_license_offer = player.license_offer_2 previous_storage_offer = player.storage_offer_2 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_2 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage player.payoff_2 = payoff_2 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_2 ) class Step3COS(Page): form_model = 'player' form_fields = ['message_offer_3', 'price_offer_3', 'license_offer_3', 'storage_offer_3'] @staticmethod def is_displayed(player: Player): return player.offer_3_counteroffer class WaitingScreen4(Page): timeout_seconds = 5 @staticmethod def is_displayed(player: Player): return player.offer_3_counteroffer class Step4COC(Page): form_model = 'player' form_fields = ["offer_4_accept", "offer_4_counteroffer", "offer_4_end_negotiation"] @staticmethod def is_displayed(player: Player): return player.offer_3_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_3 previous_license_offer = player.license_offer_3 previous_storage_offer = player.storage_offer_3 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_3 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage player.payoff_3 = payoff_3 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_3 ) class Step4COS(Page): form_model = 'player' form_fields = ['message_offer_4', 'price_offer_4', 'license_offer_4', 'storage_offer_4'] @staticmethod def is_displayed(player: Player): return player.offer_4_counteroffer class Step4_Question1(Page): form_model = 'player' form_fields = ["Coop_Slider","Fair_Slider","Trust_Slider","Weak_Slider"] @staticmethod def is_displayed(player: Player): return player.offer_4_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_4 previous_license_offer = player.license_offer_4 previous_storage_offer = player.storage_offer_4 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_4 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage player.payoff_4 = payoff_4 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_4 ) class Step4_Question2(Page): form_model = 'player' form_fields = ["Satisfy_Slider", "LongT_Slider"] @staticmethod def is_displayed(player: Player): return player.offer_4_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_4 previous_license_offer = player.license_offer_4 previous_storage_offer = player.storage_offer_4 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_4 = player.payoff_4 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_4 ) class Step4_Question3(Page): form_model = 'player' form_fields = ["i_achieve2","cp_achieve2"] @staticmethod def is_displayed(player: Player): return player.offer_4_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_4 previous_license_offer = player.license_offer_4 previous_storage_offer = player.storage_offer_4 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_4 = player.payoff_4 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_4 ) class Step5COC(Page): form_model = 'player' form_fields = ["offer_5_accept", "offer_5_counteroffer", "offer_5_end_negotiation"] @staticmethod def is_displayed(player: Player): return player.offer_4_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_4 previous_license_offer = player.license_offer_4 previous_storage_offer = player.storage_offer_4 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_4 = player.payoff_4 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_4 ) class Step5COS(Page): form_model = 'player' form_fields = ['message_offer_5', 'price_offer_5', 'license_offer_5', 'storage_offer_5'] @staticmethod def is_displayed(player: Player): return player.offer_5_counteroffer class WaitingScreen6(Page): timeout_seconds = 5 @staticmethod def is_displayed(player: Player): return player.offer_5_counteroffer class Step6COC(Page): form_model = 'player' form_fields = ["offer_6_accept", "offer_6_counteroffer", "offer_6_end_negotiation"] @staticmethod def is_displayed(player: Player): return player.offer_5_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_5 previous_license_offer = player.license_offer_5 previous_storage_offer = player.storage_offer_5 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_5 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage player.payoff_5 = payoff_5 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_5 ) class Step6COS(Page): form_model = 'player' form_fields = ['message_offer_6', 'price_offer_6', 'license_offer_6', 'storage_offer_6'] @staticmethod def is_displayed(player: Player): return player.offer_6_counteroffer class FinalMessageC(Page): @staticmethod def is_displayed(player: Player): return player.offer_6_counteroffer @staticmethod def vars_for_template(player: Player): previous_price_offer = player.price_offer_6 previous_license_offer = player.license_offer_6 previous_storage_offer = player.storage_offer_6 payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None) payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None) payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None) payoff_6 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage player.payoff_6 = payoff_6 return dict( previous_price_offer=previous_price_offer, previous_license_offer=previous_license_offer, previous_storage_offer=previous_storage_offer, payoff_previous_price=payoff_previous_price, payoff_previous_licence=payoff_previous_licence, payoff_previous_storage=payoff_previous_storage, step_payoff=payoff_6 ) class FinalMessageS(Page): form_model = 'player' form_fields = ["FinalMessageS"] @staticmethod def is_displayed(player: Player): return player.offer_0_accept or player.offer_0_end_negotiation or \ player.offer_1_accept or player.offer_1_end_negotiation or \ player.offer_2_accept or player.offer_2_end_negotiation or \ player.offer_3_accept or player.offer_3_end_negotiation or \ player.offer_4_accept or player.offer_4_end_negotiation or \ player.offer_5_accept or player.offer_5_end_negotiation class FinalQuestIntro(Page): @staticmethod def is_displayed(player: Player): return player.offer_0_accept or player.offer_0_end_negotiation or \ player.offer_1_accept or player.offer_1_end_negotiation or \ player.offer_2_accept or player.offer_2_end_negotiation or \ player.offer_3_accept or player.offer_3_end_negotiation or \ player.offer_4_accept or player.offer_4_end_negotiation or \ player.offer_5_accept or player.offer_5_end_negotiation or \ player.offer_6_counteroffer class FinalQuest(Page): form_model = 'player' form_fields = ['Coop','Agree','Compr','Accomm','Oblig','Fair','Reason','Just','Self','Soft','Weak','Compl','Yield','Honest','Real','Plaus','Sinc'] @staticmethod def is_displayed(player: Player): return player.offer_0_accept or player.offer_0_end_negotiation or \ player.offer_1_accept or player.offer_1_end_negotiation or \ player.offer_2_accept or player.offer_2_end_negotiation or \ player.offer_3_accept or player.offer_3_end_negotiation or \ player.offer_4_accept or player.offer_4_end_negotiation or \ player.offer_5_accept or player.offer_5_end_negotiation or \ player.offer_6_counteroffer @staticmethod def before_next_page(player: Player, timeout_happened): player.total_payoff = player.payoff_0 + \ player.payoff_1 + \ player.payoff_2 + \ player.payoff_3 + \ player.payoff_4 + \ player.payoff_5 + \ player.payoff_6 class FinalQuest2(Page): form_model = 'player' form_fields = ['q1','q2','q3','q4','q5','q6','q7','q8','q9','q10','q11','q12', 'q13','q14','q15','q16'] class ThankYou(Page): @staticmethod def is_displayed(player: Player): return player.offer_0_accept or player.offer_0_end_negotiation or \ player.offer_1_accept or player.offer_1_end_negotiation or \ player.offer_2_accept or player.offer_2_end_negotiation or \ player.offer_3_accept or player.offer_3_end_negotiation or \ player.offer_4_accept or player.offer_4_end_negotiation or \ player.offer_5_accept or player.offer_5_end_negotiation or \ player.offer_6_counteroffer page_sequence = [ Intro, Nickname, Expectations, InitialQuest, WhoStartsFirstWaiting, WhoStartsFirst, Step0OpeningOC, Step0CounterOS, WaitingScreen1, Step1COC, Step1COS, WaitingScreen2, Step2COC, Step2COS, WaitingScreen3, Step3COC, Step3COS, WaitingScreen4, Step4COC, Step4COS, Step4_Question1, Step4_Question2, Step4_Question3, Step5COC, Step5COS, WaitingScreen6, Step6COC, Step6COS, FinalMessageC, FinalMessageS, FinalQuestIntro, FinalQuest, FinalQuest2, ThankYou ]
#2 by ccrabbe
Hi UlkarQ - This error happens when you try to use a template variable that the software can't find defined anywhere. From the screenshot, I can see that the error comes from Step5COS.html. Looking at your Step5COS Page class, you have no vars_for_template function. This is the source of your error. If you include previous_price_offer in your vars_for_template function, this error will go away. Thanks, --Chris
#3 by UlkarQ
Thank you very much, Chris!! Best Regards, Ulkar