【问题标题】:2 forms, 1 view, 2 SQL tables in DjangoDjango 中的 2 个表单、1 个视图、2 个 SQL 表
【发布时间】:2015-07-30 16:05:00
【问题描述】:

我很难理解如何将两个 django 表单中的数据从 同一视图 提交到两个单独的数据库表中。我只想要一个提交按钮。虽然this 问题让我更接近解决方案,但我遇到了错误并且数据没有写入数据库。我认为这段代码实际上检查了这两个表单,而不是一次性提交两个表单。有什么想法吗?

这是我尝试过的:

对于一个表格 --> 一个表格。这行得通,所以这是一个开始。

# views.py
def BookFormView(request):
    if request.method == 'POST':
    form = BookForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect("/books/")
    else:
        form = BookForm()
    return render(request, 'books/createbooks.html',
              {'form' : form})

但是,当我从 forms.py 添加此表单以获取后续views.py 时,我得到local variable 'book_form' referenced before assignment。这通常是一个容易解决的全局与局部变量问题,但我不知道在这种情况下它意味着什么。

def BookFormView(request):
    if request.method == 'POST':
        if 'book' in request.POST:
            book_form = BookForm(request.POST, prefix='book')
            if book_form.is_valid():
                book_form.save()
                return HttpResponseRedirect("/books/")

            bookdetailsform = BookDetailsForm(prefix='bookdetails')
        elif 'bookdetails' in request.POST:
            bookdetailsform = BookDetailsForm(request.POST, prefix='bookdetails')
            if bookdetailsform.is_valid():
                bookdetailsform.save()
                return HttpResponseRedirect("/books/")

            book_form = BookForm(prefix='book')
    else:
        book_form = BookForm(prefix='book')
        bookdetailsform = BookDetailsForm(prefix='bookdetails')
    return render(request, 'books/createbook.html',
            {'book_form' : book_form,
             'bookdetailsform': bookdetailsform})

【问题讨论】:

  • 既然你只需要一个逻辑路径,即保存两个表单,为什么在发帖时有两个单独的 if(bookbookdetail)?
  • 有趣。诚实的答案是我不知道。我试图使用其他 SO 答案来拼凑一些可行的东西。我不明白的是如何只使用一个“如果”。明白我的意思了吗?

标签: python django


【解决方案1】:

我认为问题在于,当用户提交bookdetails 发布请求时,
它将在if 'book' in request.POST: 条件下处理。为什么?
因为字符串bookdetails包含字符串book,所以无论他们做什么样的请求,都会用if book in request.POST:条件处理。

我相信解决如果条件问题是第一步。

【讨论】:

    【解决方案2】:

    基于问题的 cmets:

    def BookFormView(request):
        if request.method == 'POST':
                book_form = BookForm(request.POST, prefix='book')
                bookdetailsform = BookDetailsForm(request.POST, prefix='bookdetails')
                if book_form.is_valid() and bookdetailsform.is_valid():
                    book_form.save()
                    bookdetailsform.save()
                    return HttpResponseRedirect("/books/")
        else:
            book_form = BookForm(prefix='book')
            bookdetailsform = BookDetailsForm(prefix='bookdetails')
        return render(request, 'books/createbook.html', 
                      {'book_form': book_form, 'bookdetailsform': bookdetailsform})
    

    【讨论】:

    • 我遇到了与最初类似的问题,并解决了类似的解决方案,但现在又遇到了一个问题。如果第二个表单应该对第一个表单返回的实例有外部字段,你建议如何将它传递到那里?在示例方面:BookDetails 模型应该有 ForeignKey 到Book。考虑book = book_form.save(),如何将book传递给bookdetailsform
    • 我强烈建议您打开一个包含所有详细信息的新问题,我很乐意为您提供帮助。
    • 太棒了,这很有意义。我意识到 bookdetailsform 有一些字段将是类型类别的自动填充或下拉字段,所以我需要弄清楚如何做到这一点,然后才能确保所有内容都正确发布。同时,我将其标记为正确,因为它解决了两个按钮和两个如果的问题。
    • @Nancy 我很高兴!如果你愿意,你也可以发布另一个问题,听起来你支持 AJAX。
    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多