I believe what you're looking for is an initial value. In __init__ the
following would achieve this:
self.fields['exercise_field'].initial = self.getRandomText(self.language,
self.dictionary)
On Friday, September 5, 2014 8:17:33 AM UTC-7, Yarick Antonov wrote:
>
> I have serious OOP design problem, and i don't know the way to solve it.
>
> *Here are two of my views:*
> def exercise(request):
> if request.method == 'GET':
> request.session["exercise_start"] = time()
> form = ExerciseForm(language = request.session["language"],
> dictionary = request.session["dictionary"])
>
> elif request.method == 'POST':
> form = ExerciseForm(request.POST, language = request.session[
> "language"], dictionary = request.session["dictionary"])
>
> if form.is_valid():
> ExerciseTime = time() - request.session["exercise_start"]
> ExerciseText = form.cleaned_data["exercise_field"]
>
> if request.user.is_authenticated():
> exercise = Exercise(player = request.user)
> exercise.time = ExerciseTime
> exercise.save()
>
> request.session["exercise_text"] = ExerciseText
> request.session["exercise_time"] = ExerciseTime
> return redirect('game_result')
> return render(request, "game/exercise.html", {'form': form})
>
> def result(request):
> exercise_result = {"exercise_text": request.session["exercise_text"],
> "exercise_time": request.session["exercise_time"]}
> return render(request, "game/result.html", exercise_result)
>
> *And here is my "exercise form" which obviously used by "exercise view":*
> class ExerciseForm(forms.Form):
> def __init__(self, *args, **kwargs):
> self.language = kwargs.pop('language', None)
> self.dictionary = kwargs.pop('dictionary', None)
> self.exercise_text = self.getRandomText(lng=self.language, dct=
> self.dictionary)
> self.SetExText()
> super(ExerciseForm, self).__init__(*args, **kwargs)
>
> def SetExText(self):
> self.exercise_text = self.getRandomText(self.language, self.
> dictionary)
> self.exercise_field.exercise_text = self.exercise_text
>
> def getRandomText(self, lng, dct):
> count = ExerciseText.objects.filter(dictionary__dictionary_name =
> dct).count()
> if count:
> rand_id = sample(range(1, count), 1)
> return ExerciseText.objects.get(id__in=rand_id).text
> else:
> return "lol"
>
> exercise_field = ExerciseField(exercise_text = exercise_text, widget =
> forms.TextInput(attrs = {'autocomplete': 'off', 'autofocus': 'autofocus'
> }))
>
> *My field, used in form above:*
> class ExerciseField(forms.CharField):
> def __init__(self, exercise_text, *args, **kwargs):
> self.exercise_text = exercise_text
> super(ExerciseField, self).__init__(*args, **kwargs)
>
> def validate(self, value):
> if value != self.exercise_text:
> raise ValidationError("Texts don't match")
>
> *And finally, simple template:*
> {% extends "base.html" %}
>
> {% block content %}
> <form action="game_result" method="post">
> {% csrf_token %}
> {{ form.exercise_text }}<br/>
> {{ form.as_p }}
> </form>
> {% endblock content %}
>
> What i try to do:
> I try to bargain two arguments which come from "create view" which not
> represent here in sake of space saving, and these two arguments are
> "language", and "dictionary".
> I use them to get a record from db table, to get random text.
>
> And here I need your help, because i can't dynamically create variable
> "exercise_text", because i need it in Class instance.
> Meaning - it need to be predefined before I'll use my "exercise_field.
>
> And also i can't put exercise_field inside of "__init__", because it will
> not be accessible in template.
>
> *In short:*
> I need to get random record from db, and i need to put this record in my
> field. How to do that? Dynamically.
>
--
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 http://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/ed45bdcc-c82d-42c7-9fb8-203d6d187148%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.