我正在尝试根据会话变量动态添加表单选择。
我有一个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()
答案 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)