I think you understood every word I wrote and every problem I had to face. I will see what ed-questionnaire has to offer, but I think that I must code very much. Now I'm doing the survey with the Delphi-like Lazarus IDE (because I know Pascal very well) and it's easy to follow the control of the flow by enabling every field I need when I exit each field after entering the answer. The disadvantage is that I have to recompile the program every time a bug is discovered (and there are full of them in more than 200 fields!). Finally, this program end up running well after four days of fixing bugs, but I was searching for a method to only fix a .py file instead of recompiling. I appreciate very much your suggestion and thank you very much! Diego
El lunes, 17 de octubre de 2016, 9:30:52 (UTC-3), Asad Jibran Ahmed escribió: > > Hi, > This is a complicated question and I'll do my best to answer it well, but > please forgive me if I miss somethings or say something inaccurate. I had a > similar project a while back and I did think about a possible solution, > something that might be of use to you. > > If you want to use something pre-built, I suggest you take a look at > https://github.com/eldest-daughter/ed-questionnaire. > > If you want something custom, read on. > > Firstly, I'd present each question to the user on a separate page. I'd > have one Django view called QuestionView. I'd have a URL config similar > to this: > > url(r'^question/(?P<pk>(\d+))/$', QuestionView.as_view(), name='question') > > Next I would come up with a data structure to hold the form configuration. > I don't mean a data structure like the ones you see in CS courses (trees, > maps, lists, etc). I mean a way to structure your data in a meaningful way. > For the scenario you describe, something like this might be a good starting > point: > > QUESTIONS = [ > { > "id": 1, > "question": "Are you a programmer?", > "options": ["No", "Yes"] > }, > > { > "id": 2, > "question": "Which operating system do you use?", > "options": ["Windows", "Linux", "macOS"] > }, > > { > "id": 3, > "question": "Which editor do you use for writing code?", > "show_if": {"question_id": 1, "answer": "Yes"} > "options": ["Vim", "Emacs", "Sublime Text", "Other"] > } > ] > > In this scenario, question id 3 is only shown if the user selected *Yes* > for question 1. Which means that you'll need to keep track of the answers > the user has already taken. Using the session storage for that is one good > option. > > So each request to the Django app returns a page with a simple HTML page > with just one form. The form only has the widgets for the question being > answered. The view would take a look at the question it has to present, and > then generate a dynamic form based on that. Check out this post for a good > description of how to generate dynamic forms: > https://jacobian.org/writing/dynamic-form-generation/. > > For question 1 in this case, the page would have a form with just 2 radio > buttons. When the user submits that form, you'll save their answer > somewhere (may the session storage) and then redirect the user to the URL > for the next question. To keep it simple, *always* redirect the user to > the next question. > > Now comes the conditional logic of whether the user has to answer the > question or not. Let's say the user selected *No *for question 1, then > answered question 2 and was redirected to the URL for question 3. At this > point, your view looks at the config for question 3. The config says to > show this question only if the answer to question 1 was *Yes*. You check > the session storage and see that the user answered *No* for the first > question. So the user shouldn't have to answer this question. You simply > redirect the user to question 4, and this entire logic is checked again. > > Of course this is only the starting point. An application like this is > going to get complicated, and you seem to indicate there is more > complicated logic involved than just the simple "Only show this question if > that question had and answer matching X". But this is a reasonable starting > point for something like this. As you develop your application further > you'll learn much more about the specific problem you're solving and come > up with much better ways of solving it. > > Hopefully this large wall of text made some sense! Let me know if I can > explain something more. Hopefully this will be of some use to you. > Regards, > > Asad Jibran Ahmed <[email protected] <javascript:>> > http://blog.asadjb.com > > On Mon, Oct 17, 2016 at 6:37 AM, Diego De La Vega <[email protected] > <javascript:>> wrote: > >> Hi. This is my first question in this group. >> >> My problem is that I have to program a survey application and I would >> like to have a hint about forms. >> >> The survey is +200 questions long and is divided in multiple subjects >> (every subject is independent from the others) and mainly consists of >> numeric (implemented as combo boxes) and text fields.. >> >> The main problem is how to do for showing the relevant fields and not the >> unwanted. >> >> Let me explan this: suppose that when the answer to question 1 is 1, the >> survey continues with question 2, but if the answer is 2, then the survey >> continues with question 16 and all the in between questions are skipped. >> >> This is a very simple scenario, but almost all the flow of the survey >> goes like this, making it complex to follow the order. Sometimes one must >> skip a few questions but some others, one must skip only one, or a full >> section of the questions, depending on the answer. >> >> Is there a recommended way to do so? Thanks in advance and sorry for my >> English, I'm not a native English speaker (I hope all this mess can be >> understood). >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Django users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To post to this group, send email to [email protected] >> <javascript:>. >> Visit this group at https://groups.google.com/group/django-users. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/django-users/55fd589d-1638-4d75-9026-c098ee7729eb%40googlegroups.com >> >> <https://groups.google.com/d/msgid/django-users/55fd589d-1638-4d75-9026-c098ee7729eb%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/21081eb6-ff09-4630-9488-d2cf64b79bdd%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.

