表格:
class SearchJobForm(forms.Form):
query = forms.CharField()
types = forms.ModelChoiceField(queryset=JobType.objects.all(), widget=forms.CheckboxSelectMultiple())
查看
def jobs_page(request):
if 'query' in request.GET:
form = SearchJobForm(request.GET)
else:
form = SearchJobForm()
variables = RequestContext(request, {
'form':form,
})
return render_to_response('jobs_page.html', variables)
在我提交表单后,我尝试将其值恢复为
形式 form = SearchJobForm(request.GET)
但它不起作用(某些字段消失)。也许是因为ModelChoiceField。如何使用get方法填充表单及其值?
答案 0 :(得分:6)
看起来您正在尝试向用户显示预先填充的表单。为此,您需要将初始参数传递给表单:
SearchJobForm(initial=request.GET)
答案 1 :(得分:1)
实际上,您可以发布整个视图方法吗?我只是测试了它并且做了
form = SearchJobForm(request.GET)
工作正常。它必须是周围代码的一个问题...
从您的代码中我认为您希望表单值以HTML格式呈现回来并填充值...这是您尝试检查表单对象是否已填充的方式?这不起作用(可能不是你想要做的 - 你想要处理表单值)。
尝试将此添加到您的视图中:
def jobs_page(request):
if 'query' in request.GET:
form = SearchJobForm(request.GET)
if form.is_valid():
print form.cleaned_data['query']
print form.cleaned_data['types']
else:
print form.errors
else:
form = SearchJobForm()
variables = RequestContext(request, {
'form':form,
})
return render_to_response('jobs_page.html', variables)
检查打印出来的内容。
你真的应该从django docs中查看this trail。
答案 2 :(得分:0)
表单对象应该来自django.forms.Form
:
from django import forms
class SearchJobForm(forms.Form):
query = forms.CharField()
types = forms.ModelChoiceField()
答案 3 :(得分:0)
当前提交的答案不适用于将值列表作为单个键的GET参数传递的情况。在后台,Django使用MultiValueDict数据结构,这种数据结构不是从具有多个值的键中获取值的好方法。下面的代码弥补了这一点,
def get_initial(self):
if self.request.method == 'GET':
initial = {}
for key, value_list in self.request.GET.lists():
if len(value_list) <= 1:
initial[key] = value_list[0]
else:
initial[key] = value_list
return initial
return super().get_initial()
该代码是为基于类的视图编写的,但可以很容易地在基于功能的视图中使用。