【问题标题】:Django Update FormDjango 更新表单
【发布时间】:2012-03-06 02:50:30
【问题描述】:

我正在一个页面中创建一个表单,然后在另一个页面中我试图拉出表单(填充了已保存在其中的数据)并希望对其进行更改,以便在我保存它时它会覆盖实例而不是创建另一个实例。

def edit(request):

    a = request.session.get('a',  None)
    form = Name_Form(request.POST, instance=a)
    if form.is_valid():
            j = form.save( commit=False )
            j.save()

这似乎有效,但它不会预先填充表单。相反,它以一个已经“提交”为空白的空白表格开始(您会看到所有错误告诉您有关必填字段的信息)

我也尝试过使用

form = Name_Form(initial={'id':a.id})

预填充表单。但是如果我这样做而不是 form = Name_Form(request.POST, instance=a)line 它不会覆盖实例,它将创建一个新实例。

我似乎无法将这两个功能结合起来。

感谢任何帮助

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    如果您使用 request.POST 设置表单,它将使用在 POST 数据中找到的值填充所有表单字段。 如果您对 GET 请求(其中 request.POST 为空)执行此操作,则使用空值填充它。

    试试:

    def edit(request):
    
        a = request.session.get('a',  None)
    
        if a is None:
            raise Http404('a was not found')
    
        if request.method == 'POST':
            form = Name_Form(request.POST, instance=a)
            if form.is_valid():
                j = form.save( commit=False )
                j.save()
        else:
            form = Name_Form( instance = a )
    

    【讨论】:

    • 说真的。谢谢你。你不知道试图弄清楚这一点给我带来了多少挫败感。
    • 我不确定它是否从未起作用,或者由于某种原因它不再起作用,但它不再覆盖实例!它正在创建一个新的,或者如果一个已经存在,它会返回一个错误! :( 想法?
    【解决方案2】:

    除非它确实存在,否则不要添加 request.POST:

    def edit(request):
    
        a = request.session.get('a',  None)
        if request.method == 'POST':
            form = Name_Form(request.POST, instance=a)
            if form.is_valid():
                    j = form.save( commit=False )
                    j.save()
        else:
            form = Name_Form(instance=a)
    

    【讨论】:

    • 感谢您的反馈!它没有覆盖实例!它正在创建一个新的,或者如果一个已经存在,它会返回一个错误! :( 想法?
    • 嗯,您可能需要发布错误,听起来像是一个不同的问题。可能与将“a”拉出会话有关?
    • 这只是一个完整性错误,因为模板中的 non_field_errors 字段。 (我将字段定义为 unique_together)
    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 2021-12-01
    • 2018-04-17
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多