【问题标题】:how can i prepopulate this update form [closed]我如何预先填充此更新表格 [关闭]
【发布时间】:2020-07-10 12:50:19
【问题描述】:

我希望在编辑表单时预先填充数据

views.py

def edit_task(request, post_id):
    post = Post.objects.get(id=post_id)
    form = TaskForm(request.POST, instance=post)
    if request.method == 'POST':
        print(request.POST)
        form = TaskForm(request.POST, instance=post)
        if form.is_valid():
            form.save()
            return redirect('task')
    context = {'form': form}
    return render(request, 'List/add_task.html', context)

add_task.html

{% extends "List/Home.html" %}
{% block content %}

<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit">
    
</form>

{% endblock content %}

【问题讨论】:

  • 这能回答你的问题吗? Pre-populating Django Forms
  • 但是我已经通过了实例
  • 分享表单html
  • 添加了 html(感谢您努力帮助我)

标签: python django


【解决方案1】:

仔细考虑如何实例化表单。目前,您对 GET 和 POST 请求使用相同的代码 TaskForm(request.POST, instance=post)

def edit_task(request, post_id):
    post = Post.objects.get(id=post_id)
    form = TaskForm(request.POST, instance=post)
    if request.method == 'POST':
        print(request.POST)
        form = TaskForm(request.POST, instance=post)
        ...

但是request.POST 对于 GET 请求是空的,因此当您使用 GET 请求加载表单时会得到一个带有错误的空表单。

您可以通过删除 GET 请求的 request.POST 来修复它

def edit_task(request, post_id):
    post = Post.objects.get(id=post_id)
    # Instantiate form without any data
    form = TaskForm(instance=post)
    if request.method == 'POST':
        print(request.POST)
        # replace the form for POST requests
        form = TaskForm(request.POST, instance=post)
        ...

使用if...else而不是替换表单可能更清楚:

def edit_task(request, post_id):
    post = Post.objects.get(id=post_id)
    if request.method == 'POST':
        print(request.POST)
        # instantiate form for POST requests
        form = TaskForm(request.POST, instance=post)
        ...
    else:
        # instantiate the form for GET requests
        form = TaskForm(instance=post)
    context = {'form': form}
    return render(request, 'List/add_task.html', context)


【讨论】:

  • 哦,现在我明白了,我正在使用发布请求来获取表单,这就是表单为空的原因。好吧,谢谢你的帮助兄弟,你真的帮了我很多,也很抱歉我是 django 的新手。
【解决方案2】:

您可以使用数据填充此表单,提供initial

def edit_task(request, post_id):
    post = Post.objects.get(id=post_id)
    form = TaskForm(request.POST if request.POST else None, instance=post, initial={
        'initial_field_name_1': 'initial_field_value_1',
...
        'initial_field_name_n': 'initial_field_value_n',
    })
    if request.method == 'POST':
        print(request.POST)
        if form.is_valid():
            form.save()
            return redirect('task')
    context = {'form': form}
    return render(request, 'List/add_task.html', context)

【讨论】:

  • 对不起,我是 django 的新手,你能告诉我什么是 'initial_field_name_1 和 'initial_field_value_1',
  • initial 在提供 instance 时对模型表单没有用 - 表单将改用实例中的值。
  • initial_field_name_1 和 initial_field_value_1 是您要提供默认值的字段的名称和值。但如上所述,这只能通过添加到表单的额外字段来完成(其他字段将由存储在数据库模型中的值填充)
猜你喜欢
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多