I’m getting back to this issue as I didn’t succeed to resolve it so far. Let’s see if reformulating publicly what I’m trying to accomplish will help me to better grasp it
What I’m trying to do
The website is an online survey containing several pages.
-
Accueil
is the landing page. It contains two different elements:-
A GDPR / privacy disclaimer, which the user needs to agree on to access the rest of the survey.
-
A area dedicated to enter the form according to two different modalities:
-
A user entering the survey for the first time will be asked to chose a personal id (a string of characters) before clicking on “yes” to approve the disclaimer. It will then lead to the
Entree
page, while clicking on “no” to refuse the privacy terms will lead to theDommage
page; -
Right below it, there is an area dedicated to retrieve a previously and partially answered survey, in order for a returning user to finish its submission. The user is asked to enter the personal id chosen during his previous session. if an existing id is provided, the user is redirected to the corresponding survey page (either
Adherent
,Ancien
orSympathisant
, according to his profile, chosen at theEntree
page), and the survey is pre-filled with the data submitted during his previous session (retrieved from the database).
-
-
-
The
Entree
page contains a simple form for the user to chose a profile among three choices (Adherent
,Ancien
orSympathisant
). Once the profile is selected, the user clicks on the Enter button and is redirected to the corresponding survey page. If no profile is selected, an error is raised. -
Adherent
,Ancien
andSympathisant
pages are similar. They’re the backbone of the survey and contain a lot of questions to be answered by the users. There are two buttons at the end of the page:-
Envoyer is an input button for definitive submission, when the survey is supposed to be complete. If the form is valid, the user is redirected to the
Conclusion
page. -
Enregistrer is a button that saves the current state of submission if the user wants to interrupt his submission for the moment and continue later. Then, when he’ll come back, he’ll just have to enter the personal id defined at the
Accueil
and will be redirected on this page, pre-filled with data from the database.
(NB: Not sure if this button is the proper solution. The idea is to implement a process to save the data in the database while bypassing the possible validation errors due to an incomplete form).
-
Once the form is sent by clicking on Envoyer, the survey is considered to be finished. The corresponding personal id won’t allow the user to access its submitted data anymore.
-
The
Conclusion
page is a complentary group of a few questions, stored in another database, and intentionnaly not linked to the previous page (Adherent
,Ancien
andSympathisant
) to preserve anonymity. At the end of the page, the form is submitted by clicking on a button labeled Envoyer. Clicking on it redirects to theMerci
page. -
The
Merci
page is the last page of the survey, where a short “Thank you” message is displayed. No more action is required from the user. -
Dommage
is a page that contains a short message and displays a link sending back to theAccueil
page, in case the user landed here by mistake.
What works and what doesn’t so far
All pages are ready and individually functioning, except for:
- Passing data from one page to another;
- Redirecting the user on the proper page from the
Entree
page; - The system allowing the user to retrieve data and answer the survey in several sessions.
1. Passing data from one page to another
All data submitted on the Accueil
page (basically a boolean field representing the user agreement) and the Adherent
, Ancien
or Sympathisant
pages need to be stored in the same table in the database, and a user’s submission needs to be on the same line in this table, no matter the page on which the data is submitted. It’s not an issue for the three principal pages (a single user is concerned by one and only one of these pages), but I didn’t succeed yet at feeding the same line in the same table while changing pages from Accueil
to Adherent
, Ancien
or Sympathisant
(Not sure if i’m being explicit enough here!). I know there’s some sort of cookie management involved, but what I’ve tried so far doesn’t work: no cookie is created, hence no cookie is passed from one page to the other.
2. Redirecting from Entree to Adherent/Ancien/Sympathisant
Edit: this point is solved. I leave the code for reference (and maybe it’ll be useful to someone else!).
models.py
class CategorieChoice(models.Model):
choix = models.CharField(
max_length=100,
unique=True
)
class Repondant(models.Model):
categorie = models.ForeignKey(
'CategorieChoice',
on_delete=models.CASCADE,
related_name="general_categorie",
null=True
)
urls.py
urlpatterns = [
path('', views.AccueilView.as_view(), name='accueil'),
path('entree/', views.EntreeView.as_view(), name='entree'),
path('adherent/', views.adherent_view, name='adherent'),
path('ancien/', views.ancien_view, name='ancien'),
path('sympathisant/', views.sympathisant_view, name='sympathisant'),
path('conclusion/', views.conclusion_view, name='conclusion'),
path('merci/', views.MerciView.as_view(), name='merci'),
path('dommage/', views.DommageView.as_view(), name='dommage'),
]
views.py
class EntreeView(FormView):
model = Repondant
form_class = EntreeForm
template_name = 'form1/entree.html'
success_url = '/adherent/'
def form_valid(self, form):
categorie_choice = form.cleaned_data['categorie']
answer = categorie_choice.choix if categorie_choice else None
if answer and 'sympathisant' in answer:
return redirect('sympathisant')
elif answer and 'ex-adherent' in answer:
return redirect('ancien')
else:
return redirect('adherent')
entree.html
<div name="categorie">
{{ form.categorie.errors }}
{{ form.categorie.label_tag }}
{{ form.categorie }}
</div>
3. Answering the survey in different sessions
I didn’t start to try and implement this yet. I figure that I’d better solve my previous issue before.
I think that’s good enough for now or I’ll end up writing a book about my little survey website! Solving the issue #2 would a good start (Edit: done!). Then I’d like to tackle the first issue, which this thread is about. Any advice are very welcome, thank you for reading this message so far!