diff --git a/README.md b/README.md
index fa0237d..ef0f9d4 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,6 @@
# OpenBootCampPython
Repository to store Python boot camp.
+
+Ejercicio 12: En este ejercicio tendrás que crear una aplicación en Django que almacene datos de directores de cine y luego se puedan ver sus películas, así como una descripción de las mismas.
+
+Tienes que personalizar el admin de la aplicación y a su vez crear las vistas de cada una de las partes de la aplicación.
diff --git a/catalog/__init__.py b/catalog/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/catalog/admin.py b/catalog/admin.py
new file mode 100644
index 0000000..aadfd34
--- /dev/null
+++ b/catalog/admin.py
@@ -0,0 +1,35 @@
+from django.contrib import admin
+from .models import Director, Genre, Movie, Country
+
+
+class MovieInline(admin.TabularInline):
+ model = Movie
+ exclude = ('id',)
+
+
+@admin.register(Director)
+class DirectorAdmin(admin.ModelAdmin):
+ list_display = ('id', 'last_name', 'first_name', 'date_of_birth', 'date_of_death')
+ list_filter = ('date_of_birth', 'date_of_death')
+ fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]
+ exclude = ('id',)
+ inlines = [MovieInline]
+
+
+@admin.register(Movie)
+class MovieAdmin(admin.ModelAdmin):
+
+ def display_genre(self):
+ """Create a string for the Genre. This is required to display genre in Admin."""
+ return ', '.join(genre.name for genre in self.genre.all()[:3])
+
+ display_genre.short_description = 'Genre'
+
+ list_display = ('id', 'title', 'director', display_genre, 'country')
+ list_filter = ('country', 'genre', 'director')
+ exclude = ('id',)
+
+
+# Register your models here.
+admin.site.register(Genre)
+admin.site.register(Country)
diff --git a/catalog/apps.py b/catalog/apps.py
new file mode 100644
index 0000000..a5993c6
--- /dev/null
+++ b/catalog/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class CatalogConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'catalog'
diff --git a/catalog/models.py b/catalog/models.py
new file mode 100644
index 0000000..77c1dec
--- /dev/null
+++ b/catalog/models.py
@@ -0,0 +1,80 @@
+from django.db import models
+from django.urls import reverse
+import uuid
+
+
+class Director(models.Model):
+ id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular director')
+ first_name = models.CharField(max_length=100)
+ last_name = models.CharField(max_length=100)
+ date_of_birth = models.DateField(null=True, blank=True)
+ date_of_death = models.DateField('Died', null=True, blank=True)
+ objects = models.Manager()
+
+ class Meta:
+ ordering = ['last_name', 'first_name']
+
+ def get_absolute_url(self):
+ """Returns the URL to access a particular director instance."""
+ return reverse('director-detail', args=[str(self.id)])
+
+ def __str__(self):
+ """String for representing the Model object."""
+ return f'{self.last_name}, {self.first_name}'
+
+
+class Genre(models.Model):
+ """Model representing a movie genre."""
+ name = models.CharField(primary_key=True, max_length=200, help_text='Enter a movie genre (e.g. Science Fiction)')
+ objects = models.Manager()
+
+ def __str__(self):
+ """String for representing the Model object."""
+ return self.name
+
+ class Meta:
+ ordering = ['name']
+
+
+class Country(models.Model):
+ """Model representing a movie country"""
+ name = models.CharField(primary_key=True, max_length=200, help_text='Enter a movie country (e.g. Spain)')
+ objects = models.Manager()
+
+ def __str__(self):
+ """String for representing the Model object."""
+ return self.name
+
+ class Meta:
+ ordering = ['name']
+
+
+class Movie(models.Model):
+ """Model representing a movie"""
+ objects = models.Manager()
+ id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular movie')
+ title = models.CharField(max_length=200)
+
+ # Foreign Key used because movie can only have one author, but authors can have multiple books
+ # Director is a string rather than an object because it hasn't been declared yet in the file
+ director = models.ForeignKey(Director, on_delete=models.SET_NULL, null=True)
+
+ summary = models.TextField(max_length=1000, help_text='Enter a brief description of the movie')
+
+ # ManyToManyField used because genre can contain many movies. Movies can cover many genres.
+ # Genre class has already been defined, so we can specify the object above.
+ genre = models.ManyToManyField(Genre, help_text='Select a genre for this movie')
+
+ country = models.ForeignKey(Country, on_delete=models.SET_NULL, null=True,
+ help_text='Select a country for this movie')
+
+ def __str__(self):
+ """String for representing the Model object."""
+ return self.title
+
+ def get_absolute_url(self):
+ """Returns the URL to access a detail record for this movie."""
+ return reverse('movie-detail', args=[str(self.id)])
+
+ class Meta:
+ ordering = ['title']
diff --git a/catalog/static/css/styles.css b/catalog/static/css/styles.css
new file mode 100644
index 0000000..40a543c
--- /dev/null
+++ b/catalog/static/css/styles.css
@@ -0,0 +1,5 @@
+.sidebar-nav {
+ margin-top: 20px;
+ padding: 0;
+ list-style: none;
+}
diff --git a/catalog/templates/base_generic.html b/catalog/templates/base_generic.html
new file mode 100644
index 0000000..8e817b6
--- /dev/null
+++ b/catalog/templates/base_generic.html
@@ -0,0 +1,45 @@
+
+
+