代码之家  ›  专栏  ›  技术社区  ›  davidavr

如何使用未绑定表单中的表单值

  •  7
  • davidavr  · 技术社区  · 16 年前

    is_valid() _有效吗() 在未绑定窗体上总是失败。

    Django的表单似乎是用编辑数据的用例设计的,这样一个未绑定的表单除了显示HTML之外就没有其他用处了。

    例如,如果我有:

    if request.method == 'GET':
        form = MyForm()
    else:
        form = MyForm(request.method.POST)
    
    if form.is_valid():
        do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
    

    if request.method == 'GET':
        form = MyForm()
        do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
    else:
        form = MyForm(request.method.POST)
        if form.is_valid():
           do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
    

    第一次调用do_query会触发form.cleaned_数据上的异常,该数据不是有效字段,因为 _有效吗() 还没有打电话。似乎我必须做一些事情,比如:

    if request.method == 'GET':
        form = MyForm()
        do_query(form['start_date'].field.initial, form['end_date'].field.initial)
    else:
        form = MyForm(request.method.POST)
        if form.is_valid():
           do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
    

    有没有人能找到更干净的方法?

    3 回复  |  直到 4 年前
        1
  •  7
  •   Matthew Christensen    16 年前

    def get_cleaned_or_initial(self, fieldname):
            if hasattr(self, 'cleaned_data'):
                return self.cleaned_data.get(fieldname)
            else:
                return self[fieldname].field.initial
    

    然后,您可以将代码重新编写为:

    if request.method == 'GET':
        form = MyForm()
    else:
        form = MyForm(request.method.POST)
        form.is_valid()
    
    do_query(form.get_cleaned_or_initial('start_date'), form.get_cleaned_or_initial('end_date'))
    
        2
  •  2
  •   zgoda    16 年前

    解开 表示没有与表单关联的数据(初始数据或稍后提供的数据),因此验证可能会失败。如其他答案(以及您自己的结论)中所述,您必须提供初始值并检查绑定数据和初始值。

    表单的用例是表单处理 验证,所以在访问之前必须要验证一些数据 cleaned_data .

        3
  •  0
  •   Justin Voss    16 年前

    您可以将初始值字典传递给表单:

    if request.method == "GET":
        # calculate my_start_date and my_end_date here...
        form = MyForm( { 'start_date': my_start_date, 'end_date': my_end_date} )
    ...
    

    official forms API documentation ,他们在那里演示了这一点。

    :根据其他用户的回答,这可能是最干净的解决方案:

    if request.method == "GET":
        form = MyForm()
        form['start_date'] = form['start_date'].field.initial
        form['end_date'] = form['end_date'].field.initial
    else:
        form = MyForm(request.method.POST)
    if form.is_valid():
        do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])