【问题标题】:Django: fill form from get methodDjango:从get方法填写表格
【发布时间】:2010-12-24 13:13:04
【问题描述】:

表格:

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 方法填写表单的值?

【问题讨论】:

  • 里面只有两个字段,但是你说“有些字段消失了”。表单的哪些字段不会被填充?您如何检查表单对象是否正在被填充?
  • 您可以考虑先在 POST 中提交表单,然后将代码更改为 request.POST。如果这不起作用,那么您可以在其他地方寻找问题。
  • 仅显示提交按钮 - 其他 2 个字段不显示(字段本身)。我不能使用帖子,因为我有分页,我不知道如何用帖子分页。
  • request.POSTrequest.GET 都是 [QueryDicts][1],所以两者都应该工作。你确定请求参数在request.GET中吗?如果您在views.py 的顶部print request.GET 它确实会显示其中的内容? [1]:docs.djangoproject.com/en/dev/ref/request-response/…
  • 是的,我可以看到内容。例如 ?query=d&types=1 我得到 QueryDict: {u'query': [u'd'], u'types': [u'1']} 但字段不会显示(

标签: django forms


【解决方案1】:

表单对象应该来自django.forms.Form:

from django import forms

class SearchJobForm(forms.Form):
    query = forms.CharField()
    types = forms.ModelChoiceField()

【讨论】:

  • 问题出在其他地方。
  • 请编辑您的问题以反映这一点。并查看我对您的问题的评论:表单中没有填充什么以及您如何检查数据是否已填充?
【解决方案2】:

实际上,您可以发布您的整个视图方法吗?我刚刚测试了它并在做

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 文档中的 this trail

【讨论】:

    【解决方案3】:

    您似乎正在尝试向用户显示预先填充的表单。为此,您需要将初始参数传递给您的表单:

    SearchJobForm(initial=request.GET)
    

    【讨论】:

    • 在 Django 1.9.x 中仅使用 SearchJobForm(initial=request.GET.dict())
    • @Jakobovski 查看我发布的关于容纳列表项的答案。
    【解决方案4】:

    当前提交的答案不处理值列表作为单个键的 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()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多