├── .gitignore ├── README.md ├── manage.py ├── media └── post │ └── photos │ └── create_user_custom.png ├── photogram ├── __init__.py ├── asgi.py ├── middleware.py ├── settings.py ├── urls.py ├── views.py └── wsgi.py ├── posts ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── tests.py └── views.py ├── readme_img ├── app_posts.png ├── create_user_custom.png ├── csrf_token.png ├── dashboard_login.png ├── dashboard_menu.png ├── dashboard_profile_list_custom.png ├── dashboard_users_add.png ├── dashboard_users_list.png ├── detalle_personalizado.png ├── django_2.png ├── estilado.gif ├── hello_world.png ├── middleware.png ├── numbers.png ├── post_hola_mundo.png ├── posts.png ├── posts_diccionario.png ├── posts_diccionario_titulos.png ├── posts_navbar.png ├── profile.png ├── profile_error.png ├── profile_error_styled.png ├── registed_protected.gif ├── static_folder.png ├── template_feed.png ├── templates.png ├── unregisted_protected.gif ├── url_params_1.png ├── url_params_2.png ├── user_dashboard_custom.png └── views.png ├── static ├── css │ ├── bootstrap.min.css │ └── main.css └── img │ ├── default-profile.png │ └── instagram.png ├── templates ├── base.html ├── nav.html ├── posts │ ├── feed.html │ └── new.html └── users │ ├── base.html │ ├── login.html │ ├── signup.html │ └── update_profile.html └── users ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations ├── 0001_initial.py └── __init__.py ├── models.py ├── pictures ├── dashboard_menu.png └── dashboard_users_list.png ├── tests.py └── views.py /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | db.sqlite3 3 | __pycache__/ 4 | media/ 5 | .env -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
{{ post.title }}
516 | {% endfor %} 517 | ``` 518 | 519 | Y el resultado en [**http://localhost:8000/posts/**](http://localhost:8000/posts/) 520 | 521 |{{ error }}
1441 | {% endif %} 1442 | 1443 | 1444 | 1458 | 1459 | {% endblock %} 1460 | ``` 1461 | 1462 | Teniendo listo nuestro **template** ahora crearemos la función que renderizara nuestra vista. Para ello iremos a _users/**views.py**_ 1463 | 1464 | ```py 1465 | # Django 1466 | ... 1467 | # Vamos hacer uso de render y redirect 1468 | from django.shortcuts import render, redirect 1469 | 1470 | # Exceptions 1471 | # Importamos posible error al tratar de crear una instancia con valor único que ya existe 1472 | from django.db.utils import IntegrityError 1473 | 1474 | # Models 1475 | # Importamos los modelos de las instancias que crearemos 1476 | from django.contrib.auth.models import User 1477 | from users.models import Profile 1478 | 1479 | ... 1480 | 1481 | def signup(request): 1482 | # Al recibir el metodo POST. 1483 | if request.method == 'POST': 1484 | username = request.POST['username'] 1485 | password = request.POST['password'] 1486 | password_confirmation = request.POST['password_confirmation'] 1487 | 1488 | # Confirmamos que las constraseñas sean iguales. 1489 | if password != password_confirmation: 1490 | # En caso de error volvemos a renderizar signup, pero enviamos el error. 1491 | return render(request, 'users/signup.html', {'error': 'Passwords does not match'}) 1492 | 1493 | try: 1494 | # Creamos una instancia de User 1495 | user = User.objects.create_user(username=username, password=password) 1496 | except IntegrityError: 1497 | # En caso que username (nuestro valor unico) ya exista renderizara 1498 | # nuevamente signup pero enviando el error. 1499 | return render(request, 'users/signup.html', {'error': 'Username is already exist'}) 1500 | # Ya creada la instancia le pasamos los siguientes valores. 1501 | user.first_name = request.POST['first_name'] 1502 | user.last_name = request.POST['last_name'] 1503 | user.email = request.POST['email'] 1504 | # Lo guardamos en nuestra base de datos. 1505 | user.save() 1506 | 1507 | # Creamos nuestra instacia de Profile a traves de user. 1508 | profile = Profile(user=user) 1509 | # Lo guardamos en la base de datos. 1510 | profile.save() 1511 | 1512 | # Nos redirigimos a login para iniciar sesion con el nuevo usuario. 1513 | return redirect('login') 1514 | 1515 | return render(request, 'users/signup.html') 1516 | 1517 | ... 1518 | ``` 1519 | 1520 | Ahora nos faltaría solo asignar un path a nuestro signup, lo configuraremos en _urls.py_ 1521 | 1522 | ```py 1523 | ... 1524 | 1525 | urlpatterns = [ 1526 | ... 1527 | 1528 | path('users/signup', users_views.signup, name='signup'), 1529 | 1530 | ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 1531 | 1532 | ... 1533 | ``` 1534 | 1535 | ## Middlewares 1536 | 1537 | El término **middleware** se refiere a un sistema de software que ofrece servicios y funciones comunes para las aplicaciones. En general, el middleware se encarga de las tareas de gestión de datos, servicios de aplicaciones, mensajería, autenticación y gestión de API. 1538 | 1539 | En este apartado aprenderemos como crear nuestro propio **middleware**, este no permitira la navegación en la aplicación si es que el usuario **no tiene fotografia o biografía.** 1540 | 1541 | Primero crearemos un template del perfil donde el usuario podra modificar su información. Este template sera simple por el momento y estara en _templates/users/**update_profile.html**_ 1542 | 1543 | ```html 1544 | 1545 | {% extends "base.html" %} 1546 | 1547 | {% block head_content %} 1548 |{{ post.user.get_full_name }}
17 |23 | 24 | 25 | 30 likes 26 |
27 |28 | {{ post.title }} - {{ post.created }} 29 |
30 |Don't have an account yet? Sign up here.
30 | 31 | {% endblock %} -------------------------------------------------------------------------------- /templates/users/signup.html: -------------------------------------------------------------------------------- 1 | {% extends 'users/base.html' %} 2 | 3 | {% block head_content %} 4 |