Propósito y Problema:
Quiero poner dos formularios en la misma plantilla y procesarlos en una sola vista. Puedo obtener la plantilla para mostrar los dos formularios pero no enviarlos (es decir, procesar el envío). Cuando envío me sale el siguiente error:
Exception Value: NOT NULL constraint failed: stockinfo_note.stock_id'stock' es ForeignKey. No puedo entender cómo obtener la función stock_new en Views.py para completar la ID de clave externa, que es lo que creo que debo hacer para superar el error anterior.
Modelos.py:
class Stock(models.Model): ''' Model representing the stock info. ''' user = models.ForeignKey(User) ticker_code = models.CharField(max_length=10, null=True, blank=True) def __str__(self): return self.ticker_code class Note(models.Model): ''' Model representing the note. ''' user = models.ForeignKey(User) text_note = models.TextField() stock = models.ForeignKey(Stock) def __str__(self): return self.text_noteFormularios.py
class StockForm(forms.ModelForm): class Meta: model = Stock fields = ('ticker_code',) class NoteForm(forms.ModelForm): class Meta: model = Note fields = ('text_note',)Vistas.py
def stocknoter(request): stock = Stock.objects.filter(user=request.user) note = Note.objects.filter(user=request.user) context_dict = {'stock':stock, 'note':note} return render(request, "stocknoter/stock.html", context_dict) def stock_new(request): if request.method == "POST": form1 = StockForm(request.POST) form2 = NoteForm(request.POST) if form1.is_valid() and form2.is_valid(): stock = form1.save(commit=False) stock.user = request.user stock.save() note = form2.save(commit=False) note.user = request.user ''' **THE PROBLEM IS AROUND HERE i think, how do i pass stock_id created by form1 so form2 saves it as the foreignkey?** ''' note.save() return redirect('stock') else: form1 = StockForm() form2 = NoteForm() return render(request, 'stocknoter/stock_edit.html', {'form1':form1, 'form2':form2})Como se mencionó anteriormente, creo que el problema radica en esta última sección (lo siento, debo agregar que soy nuevo en Django). ¿Qué debo hacer para guardar la identificación de la clave externa?
Bien solucionado el problema. En stock_new agregué: note.stock = stock
Así que views.py ahora se ve así:
def stocknoter(request): stock = Stock.objects.filter(user=request.user) note = Note.objects.filter(user=request.user) context_dict = {'stock':stock, 'note':note} return render(request, "stocknoter/stock.html", context_dict) def stock_new(request): if request.method == "POST": form1 = StockForm(request.POST) form2 = NoteForm(request.POST) if form1.is_valid() and form2.is_valid(): stock = form1.save(commit=False) stock.user = request.user stock.save() note = form2.save(commit=False) note.user = request.user note.stock = stock note.save() return redirect('stock') else: form1 = StockForm() form2 = NoteForm() return render(request, 'stocknoter/stock_edit.html', {'form1':form1, 'form2':form2})