动态表单选择未显示:DJANGO

时间:2020-04-12 16:06:36

标签: python django

我正在尝试根据会话变量动态添加表单选择。

我有一个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'}))

但是,呈现了表单,并且choicefield为空。非常感谢您的帮助。

我不完全确定这是实现我要实现的目标的最佳方法,因此欢迎使用任何其他方法,基本上我要做的就是根据具体情况动态设置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 :(得分:0)

Django的Form属性是类的静态属性,这意味着您不能动态设置它们(它们在声明类时(而不是在运行时评估),这就是为什么选择为空的原因)。 :)

我认为获得所需内容的最佳方法是手动呈现表单(例如:{% for choice in choices %}),使用TextField作为表单属性,并使用表单的方法clean_choices()验证输入。表单类:请参见https://docs.djangoproject.com/en/3.0/ref/forms/validation/#cleaning-a-specific-field-attribute

答案 1 :(得分:0)

通过将我的views.py修改为以下内容来使其正常工作:

find = "https://example.com"
sqlite_select_query = "SELECT * FROM 'table' where links LIKE '%'|| ? || '%'"
c.execute(sqlite_select_query, (find,))

,然后将表单上的字段更改为 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)

相关问题