Problema con dos formularios en una plantilla. Error " Generic detail view addAutorXlibro must be called with either an object pk or a slug in the URLconf."

19 views
Skip to first unread message

Diego Puerta

unread,
Mar 21, 2019, 10:09:02 PM3/21/19
to Django users
Para comentarles mi problema los contextualizo:
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
{% block contenido %}
<form method="post"> {% csrf_token %}
{{ form2.as_p }}
<div>-------</div>
{{ form.as_p }}
<button class="btn btn-primary" type="sumit">Guardar</button>
</form>
{% endblock %}

url
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:

AttributeError at /add-libros-autor

Generic detail view addAutorXlibro must be called with either an object pk or a slug in the URLconf.

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.
Reply all
Reply to author
Forward
0 new messages