Django: Refresh Problem | Website für einen Sprachtest

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
Schwarzer Wolf
User
Beiträge: 56
Registriert: Donnerstag 5. Januar 2017, 05:24

Ich Grüße Euch

Ich bin dabei eine kleine Django APP zu schreiben, die ein wenig auf einen schriftlichen Teil einer Sprachprüfung vorbereitet. Aber seit Tagen komme ich nicht mehr weiter, trotz einiger Recherche. Das Problem ist Folgendes:

Wie kriege ich das hin, dass nur einmal bei beginn (bei Neustart der Übung) ein zufälliger Text erzeugt wird, und ansonsten nur der bereits geladene Text?

Habe es schon erfolglos mit verschiedenen if | else Techniken probiert und auch mit anderen Seiten, auf die ich verlinkt habe. Am besten wäre es, wenn die Auswertung auf der gleichen Seite wie der Test zu sehen wäre ['telc/read_comp1.html'].

Hier der relevante Teil der view.py:

Code: Alles auswählen

def read_comp1(request):
    exercise_list = ReadComp1.objects.filter(status='activated')
    exercise = random.choice(exercise_list)
    exercise.text, selection_set, solution = _read_comp1_mod(exercise.text)

    if request.method == 'GET':
        form = ReadComp1Form()
    else:
        form = ReadComp1Form(request.POST)
        if form.is_valid():
            a = form.cleaned_data['a']
            b = form.cleaned_data['b']
            c = form.cleaned_data['c']
            d = form.cleaned_data['d']
            e = form.cleaned_data['e']
            f = form.cleaned_data['f']

            answers = [a, b, c, d, e, f]

            context = {
                'exercise': exercise,
                'selection_set': selection_set,
                'form': form,
                'answers': answers
            }

            return render(request, 'telc/read_comp1.html', context)

    context = {
        'exercise': exercise,
        'selection_set': selection_set,
        'form':form
    }

    return render(request, 'telc/read_comp1.html', context)
Der Code an sich ist noch recht alphamäßig, da ich erst eine funktionierende Version haben wollte, bevor ich mich ans Optimieren mache.
Wer in der Wildnis lebt, muss zum Wolf werden, oder als Schaf sterben.
(Syrisches Sprichwort)
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Du musst Dir die Übung irgendwie über die Aufrufe hinweg merken. Über einen Parameter in der URL, oder über ein Cookie, oder in der Datenbank, beispielsweise.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
Schwarzer Wolf
User
Beiträge: 56
Registriert: Donnerstag 5. Januar 2017, 05:24

__blackjack__ hat geschrieben: Donnerstag 12. Juli 2018, 13:51 Du musst Dir die Übung irgendwie über die Aufrufe hinweg merken. Über einen Parameter in der URL, oder über ein Cookie, oder in der Datenbank, beispielsweise.
Danke für die schnelle Antwort. Jetzt hab ich zumindest schon mal bessere Lösungsansätze.

Mit Parameter in der URL meinst Du GET? Ist das erste Mal, dass ich Forms benutze, und bisher blicke ich nicht so richtig durch. Der Gedanke mit Datenbank kam mir auch schon. Das müsste ich dann manuell machen in einer extra Tabelle, oder bietet Django eine Möglichkeit?

Welchen der 3 Wege würdest Du denn Empfehlen bzw. welches ist der leichteste? Die App soll vermutlich nur lokal laufen, also nichts 'Großes'.
Wer in der Wildnis lebt, muss zum Wolf werden, oder als Schaf sterben.
(Syrisches Sprichwort)
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Django kennt Sessions, in denen man solche Informationen ganz einfach speichern kann.

Du solltest versuchen, doppelten Code zu vermeiden:

Code: Alles auswählen

def read_comp1(request):
    exercise_list = ReadComp1.objects.filter(status='activated')
    exercise = random.choice(exercise_list)
    exercise.text, selection_set, solution = _read_comp1_mod(exercise.text)

    context = {
        'exercise': exercise,
        'selection_set': selection_set,
        'form':form
    }

    if request.method == 'GET':
        form = ReadComp1Form()
    else:
        form = ReadComp1Form(request.POST)
        if form.is_valid():
            context['answers'] = [
                form.cleaned_data[k] for k in ('a', 'b', 'c', 'd', 'e', 'f')
            ]
    return render(request, 'telc/read_comp1.html', context)
Benutzeravatar
Schwarzer Wolf
User
Beiträge: 56
Registriert: Donnerstag 5. Januar 2017, 05:24

Sirius3 hat geschrieben: Donnerstag 12. Juli 2018, 14:34 Django kennt Sessions, in denen man solche Informationen ganz einfach speichern kann.
Danke, hat mir sehr geholfen. :P
Wer in der Wildnis lebt, muss zum Wolf werden, oder als Schaf sterben.
(Syrisches Sprichwort)
Antworten