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.
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/429871d5-7c1e-4a00-a0c7-a60ec1809d50%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.