2015-05-19 13 views
3

Я стараюсь понять, как отправлять данные из двух форм django в две отдельные таблицы базы данных из того же вида. Мне нужна только одна кнопка отправки. В то время как вопрос this поставил меня ближе к решению, я получаю ошибки и данные не записываются в базу данных. Я думаю, что этот код фактически проверяет две формы друг против друга, а не представляет обе формы за один раз. Есть идеи?2 формы, 1 вид, 2 таблицы SQL в Django

Вот что я пробовал:

Для одна формы -> одна таблицы. Это работает, так что это начало.

# 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. Это, как правило, простая проблема с глобальной переменной vs-local для исправления, но я не знаю, что это значит в этом случае.

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}) 
+0

Почему у вас есть два отдельных сослагательного наклонения при размещении ('' book' и bookdetail'), поскольку требуется только один логический путь, то есть, чтобы сохранить обе формы? – Wtower

+0

Интересно. Честный ответ заключается в том, что я не знаю; Я пытался использовать другие ответы SO, чтобы собрать что-то, что сработает. Я не понимаю, как использовать только «если». Смотрите, что я имею в виду? – Nancy

ответ

1

На основе замечаний на вопрос по:

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}) 
+0

У меня проблема, похожая на начальную, и работала вокруг аналогичного решения, но теперь борется с еще одним вопросом. Если вторая форма должна иметь внешнее поле для экземпляра, возвращаемого первой формой, как вы предлагаете передать его там? В терминах примера: модель «BookDetails» должна иметь ForeignKey для «Book». Учитывая 'book = book_form.save()', как передать 'book' в' bookdetailsform'? –

+0

Я настоятельно рекомендую вам открыть новый вопрос со всеми подробностями, и я буду очень рад помочь вам. – Wtower

+0

Вот мой родственный вопрос http://stackoverflow.com/questions/30329804/one-html-form-several-interrelated-django-forms-how-to-save –

0

Я думаю, что проблема в том, что когда пользователь отправляет запрос на bookdetails пост,
будет транспортироваться в if 'book' in request.POST: состоянии. Зачем?
потому что строка bookdetails содержит строку book, независимо от типа запроса, она будет обрабатываться с условием if book in request.POST:.

Я считаю, что если состояние проблема - первый шаг.

Смежные вопросы