Python Django 1.8 ModelForm request.POST替代实例

Python Django 1.8 ModelForm request.POST替代实例,python,django,django-forms,Python,Django,Django Forms,所以我正在使用Django1.8Alpha代码库,想看看是否还有其他人遇到了这个有趣的问题。我有一个模型: class ChildForm(forms.ModelForm): class Meta: model = Child fields = ('first_name', 'last_name', 'gender', 'birthday', 'avatar') 我也有我的看法: @login_required def edit_child(reques

所以我正在使用Django1.8Alpha代码库,想看看是否还有其他人遇到了这个有趣的问题。我有一个模型:

class ChildForm(forms.ModelForm):
    class Meta:
        model = Child
        fields = ('first_name', 'last_name', 'gender', 'birthday', 'avatar')
我也有我的看法:

@login_required
def edit_child(request, id):
    """Edit a child"""
    child = get_object_or_404(Child, pk=id)

    if not child.parent == request.user:
        raise Http404()

    form = ChildForm(request.POST, request.FILES, instance=child)

    if request.method == 'POST' and form.is_valid():
        form.save()
        return redirect('dashboard')

    context = {
        'child': child,
        'form': form
    }

    return render(request, 'edit_child.html', context)
当我在模板中呈现表单时,除了一件事,一切都正常。初始值为空。在Django的以前版本中,将
request.POST
instance=child
一起使用,可以让实例通过并填充表单。但出于某种奇怪的原因,它似乎接受request.POST作为初始状态而不是实例。在调试中:

  • 表格是装订好的
  • 表单中的初始数据设置正确
  • 实例设置正确
唯一的问题是渲染。为了便于展示,以下是我使用crispy_表单进行表单呈现的模板:

<form role="form" method="post" action="{{ child.get_edit_url }}" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form|crispy }}
    <button type="submit" class="btn btn-default">Save</button>
</form>

{%csrf_令牌%}
{{form | crispy}}
拯救

有人以前看到过这一点,或者看到我明显做错了什么吗?

因此,如果为文件和post数据返回dict,我需要显式设置
None

form = ChildForm(request.POST or None, request.FILES or None, instance=child)

继续。

通常情况下,您不会将request.POST传递到表单,除非它实际上是一个POST。@DanielRoseman在某些情况下,是的,您可以在检查POST后定义表单,但Django允许您这样做,因为您可以看到这里:我不确定该链接应该显示给我什么。在那里,他们使用POST数据在保存表单之前实例化表单。不应将数据传递给初始显示;除此之外,它还绑定它并触发验证,所以在第一次显示时,您将得到任何错误,这很少是您想要的。@DanielRoseman它不是这样工作的。本质上,它是一个字典合并,其中GET请求上的request.POST={},实例本身拥有所有定义的键和值。因此,在GET请求上,没有任何内容被覆盖,但是当POST请求通过时,相关的键被更新。其思想是,如果存在错误,您希望为用户合并实例和更新的post数据。至少我相信是这样。该链接或多或少是一种方式,表明以这种方式初始化表单是Django的“事情”。合并发生在
初始
dict中,而不是
数据
文件
。如果
数据
文件
中有一个文件,则您的表单被视为已绑定。如果在绑定表单时,
数据
中缺少某个键,则认为该键已被用户显式删除,因此该键将为空。