【问题标题】:Django, how to include pre-existing data in update form viewDjango,如何在更新表单视图中包含预先存在的数据
【发布时间】:2018-09-25 09:27:49
【问题描述】:

更新时我无法看到预先存在的表单数据。表单工作正常,提交数据库后更新,但为了提交用户必须输入所有表单数据(包括不会更新的数据)。重新输入时,以前的数据不可见。有没有办法在表单字段中显示正在更新的模型实例的当前数据?

表格:

UpdateSomethingForm(forms.ModelForm):
    class Meta:
    model = Something
    fields = ['field1', 'field2', 'field3']

观看次数:

def update_something(request, object_pk):
    form = UpdateSomethingForm()
    context_dict = {}
    try:
        instance = Something.objects.get(pk=object_pk)
        context_dict['instance'] = instance
    except Something.DoesNotExist:
        context_dict['instance'] = None
    if request.method == 'POST':
        form = UpdateSomethingForm(request.POST, instance=instance)
        if form.is_valid():
            form.save(commit=True)
            return HttpResponseRedirect('/home')
        else:
            print(form.errors)
    context_dict['form'] = form
    return render(request, 'form.html', context=context_dict)

HTML:

<form role="form" method="post">
   {% csrf_token %}
   {{ form|bootstrap }}
   <div class="form-group">
      <button type="submit" class="btn btn-primary">Submit</button>
    </div>
</form>

【问题讨论】:

  • 如果你创建一个项目也可能出错,因为那时instance永远不会被定义。

标签: django


【解决方案1】:

您在 POST 上传递了实例参数,但在 GET 上没有传递。

form = UpdateSomethingForm(instance=instance)

全文:

def update_something(request, object_pk):
    try:
        instance = Something.objects.get(pk=object_pk)
    except Something.DoesNotExist:
        instance = None
    if request.method == 'POST':
        form = UpdateSomethingForm(request.POST, instance=instance)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/home')
    else:
        form = UpdateSomethingForm(instance=instance)
    context_dict = {'form': form, 'instance': instance}
    return render(request, 'form.html', context_dict)

【讨论】:

  • 谢谢,成功了。我看到了我所犯的错误。
  • 如果它对您有帮助,请不要忘记接受答案,作为未来搜索者的标志。
【解决方案2】:

主要问题是你构造了一个空的Form,即使可以找到实例。但是你一开始就让视图变得相当“混乱”。

可能更易读的视图是:

def update_something(request, object_pk):
    context_dict = {}
    try:
        instance = Something.objects.get(pk=object_pk)
    except Something.DoesNotExist:
        instance = None
    context_dict['instance'] = instance
    if request.method == 'POST':
        form = UpdateSomethingForm(request.POST, instance=instance)
        if form.is_valid():
            form.save(commit=True)
            return redirect('view_name')
    else:
        form = UpdateSomethingForm(instance=instance)
    context_dict['form'] = form
    return render(request, 'form.html', context=context_dict)

这里我们确保始终定义 instance 变量,在 except 主体“触发”的情况下也是如此。

此外,最好使用redirect(..) 并通过 URL 传递 视图的名称,因为如果您更改该视图的 URL,这仍然有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2012-09-29
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多