Es un ejercicio de prática.
Django 2.1.5; PyCharms
Tengo dos modelos relacionados, la idea es poder ingresar datos desde un mismo formulario a los dos modelos, para eso tengo lo siquiente:
Modelos:
class Autor(models.Model):
nombre = models.CharField('Nombres', max_length=80)
nacionalidad = models.CharField('Nacionalidad', max_length=80)
edad = models.IntegerField('Edad')
def __str__(self):
return self.nombre
class Libros(models.Model):
title = models.CharField('Título', blank=False, max_length=150)
resume = models.TextField('Resumen', blank=True)
autor = models.ForeignKey(Autor, on_delete=models.CASCADE)
idioma = models.ForeignKey(Idioma, on_delete=models.CASCADE)
def __str__(self):
return self.title
Formularios
class forLibros(forms.ModelForm):
class Meta:
model = Libros
#falta poner el campo autor para que funcione bien el formulario
fields = [
'title', 'resume', 'idioma',
]
labels = {
'title': 'Título', 'resume': 'Resumen', 'idioma': 'Idioma',
}
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control'}),
'resume': forms.TextInput(attrs={'class': 'form-control'}),
'idioma': forms.Select(attrs={'class': 'form-control'}),
}
class forAutor(forms.ModelForm):
class Meta:
model = Autor
fields = ['nombre', 'nacionalidad', 'edad']
labels = {'Nombre': 'nombre', 'Nacionalidad': 'nacionalidad', 'Edad': 'edad'}
widgets = {
'nombre': forms.TextInput(attrs={'class': 'form-control'}),
'nacionalidad': forms.TextInput(attrs={'class': 'form-control'}),
'edad': forms.NumberInput(attrs={'class': 'form-control'}),
}
Vista
class addAutorXlibro(CreateView):
model = Libros
template_name = 'biblioteca/add-libros-autor.html'
form_class = forLibros
second_for_class = forAutor
success_url = reverse_lazy('inicio_app:index')
def get_context_data(self, **kwargs):
context = super(addAutorXlibro, self).get_context_data(**kwargs)
if 'form' not in context:
context['form'] = self.form_class(self.request.GET)
if 'form2' not in context:
context['form2'] = self.second_for_class(self.request.GET)
return context
def post(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.form_class(request.POST)
form2 = self.second_for_class(request.POST)
if form.is_valid() and form2.is_valid():
libro = form.save(commit=False)
libro.autor = form2.save()
libro.save()
return HttpResponseRedirect(self.get_success_url())
else:
return self.render_to_response(self.get_context_data(form=form, form2=form))
Plantilla
path('add-libros-autor', views.addAutorXlibro.as_view(), name="add-libros-autor"),El formulario se pinta bien, pero cuando ingreso los datos y doy clic en guardar me sale este error:
Me está pidiendo un parámetro en la url. Si por ejemplo le paso un /1 , todo me funciona bien. Lo que quiero saber, es porqué siempre me pide ese parámetro o si hay una forma de que el formulario funcione sin tener que poder ese /1.