Dynami c выбор форм не отображается: DJANGO - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь динамически добавлять варианты выбора на основе переменной сеанса.

У меня есть файл views.py с формой выбора, которая перенаправляет на мою вторую форму (которая не отображает мои варианты выбора)

views.py:

def teacher(request):

  if request.method == 'GET':
      form = TeacherForm()

  else:
      form = TeacherForm(request.POST)
      if form.is_valid():
          date_list = []
          if form.cleaned_data['teacher'] == 'No Preference':
              for i in Availability.objects.all():
                  date_list.append(str(i.dates))
              request.session['choices'] = tuple(date_list)

      return redirect('book-appt')

  context = {
      'form': form,
  }

  return render(request, 'main/booktchr.html', context)

после успешной отправки вышеуказанного представления пользователь отправляется в другое представление с другой формой. В этом втором представлении в следующей форме init я пытаюсь заполнить выбор хранилищами в переменной сеанса выше.

forms.py:

class BookingForm(forms.Form):

   def __init__(self,request,*args,**kwargs):
      super (BookingForm,self).__init__(*args,**kwargs)
      self.fields['booking_date'].choices = request.session['choices']


   booking_date = forms.CharField(widget=forms.Select(attrs={'class': 'form-control'}))

Однако форма отображается и поле выбора пусто. Любая помощь очень ценится.

Я не совсем уверен, что это лучший способ достичь того, чего я пытаюсь достичь, поэтому любые другие методы приветствуются, в основном я пытаюсь установить booking_date выбор динамически зависит от того, что установлено в переменной request.session['choices'] в представлении.

спасибо

РЕДАКТИРОВАТЬ: все получилось. Пришлось изменить мои views.py следующим образом:

def teacher(request):

  if request.method == 'GET':
      form = TeacherForm()

  else:
      form = TeacherForm(request.POST)
      if form.is_valid():
          date_list = [("", "date")]
          if form.cleaned_data['teacher'] == 'No Preference':
              for i in Availability.objects.all():
                  date_list.append((str(i.user), str(i.dates)))
              request.session['choices'] = date_list

      return redirect('book-appt')

  context = {
      'form': form,
  }

  return render(request, 'main/booktchr.html', context)

и изменить мое поле в форме на booking_date = forms.ChoiceField()

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Получилось, отредактировав my views.py в следующем формате:

 def teacher(request):

  if request.method == 'GET':
      form = TeacherForm()

  else:
      form = TeacherForm(request.POST)
      if form.is_valid():
          date_list = [("", "date")]
          if form.cleaned_data['teacher'] == 'No Preference':
              for i in Availability.objects.all():
                  date_list.append((str(i.user), str(i.dates)))
              request.session['choices'] = date_list

      return redirect('book-appt')

  context = {
      'form': form,
  }

  return render(request, 'main/booktchr.html', context)

и изменив мое поле в форме на booking_date = forms.ChoiceField()

0 голосов
/ 12 апреля 2020

Свойства формы Django являются стандартными * свойствами класса, это означает, что вы не можете установить их динамически (они оцениваются при объявлении класса, а не во время выполнения, поэтому варианты выбора пусты) , :)

Я думаю, что лучший способ получить то, что вы хотите, - визуализировать форму вручную (например, {% for choice in choices %}), использовать TextField в качестве свойства формы и проверить ввод с помощью метода clean_choices() из класс формы: см. https://docs.djangoproject.com/en/3.0/ref/forms/validation/#cleaning -a-speci c -field-attribute

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...