Django:从get方法填充表单

时间:2009-12-08 18:42:55

标签: django forms

表格:

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方法填充表单及其值?

4 个答案:

答案 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()

该代码是为基于类的视图编写的,但可以很容易地在基于功能的视图中使用。