#1
by
mitnec
Hello,
My question is pretty much what it says on the tin. Respondents' incorrect guesses to a particular kind of question may be informative, and I'd like to capture them. Right now we can bounce them with e.g. {field_name}_error_message() if the answer is wrong, but in that case their response is not recorded.
I can think of ways to do this with e.g. many identical fields (guess_1, guess_2) and javascript, but that seems like it's not the best way. I also suppose you could do this with live pages and ExtraModel. But I have the intuition there is a better way.
Any ideas?
#2
by
Chris_oTree
Here is an implementation that can store wrong answers for multiple different fields. I set 'response' to be a StringField so that it can flexibly store incorrect responses of any type (bool/string/number).
class Player(BasePlayer):
myfield = models.IntegerField()
class IncorrectResponse(ExtraModel):
player = models.Link(Player)
field_name = models.StringField()
response = models.StringField()
def myfield_error_message(player, value):
if value != 42:
IncorrectResponse.create(player=player, field_name='myfield', response=str(value))
return "Wrong answer"
#3
by
mitnec
Neat, thank you!
#4
by
Chris_oTree
Here is a way to record incorrect answers for multiple fields at once:
@staticmethod
def error_message(player: Player, values):
solutions = dict(quiz1=4, quiz2='Ottawa', quiz3=2019, quiz4=False)
errors = {f: 'Try again' for f in solutions if values[f] != solutions[f]}
if errors:
for field_name in errors:
response = values[field_name]
IncorrectResponse.create(player=player, field_name=field_name, response=str(response))
return errors