Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Class-based views

28/37
Recursos

Veamos de qué forma optimizamos el proceso de creación de nuestras apps de forma que no repitamos código. Para ver cuál es el concepto de class based views.

Las vistas también pueden ser clases, que tienen el objetivo de evitar la repetición de tareas como mostrar los templates, son vistas genéricas que resuelven problemas comunes.

Aportes 30

Preguntas 11

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Esta clase me costo un poco arreglar las cosas :v para que siguiera funcionando las escribiré por si alguien le cuesta como a mi

en la carpeta users el archivo urls.py es mejor poner el route así como dice el comentario de tomas

route = 'profile/<str:username>/',

y también en ese mismo archivo hay que quitarle la palabra users a los route de los path pues si no tendríamos que estar poniendo en el navegador users/users/login y pues no, así que lo quitamos y quedaría así

    path(
        route = 'login/', 
        view = views.login_view, 
        name='login'
    ),
    path(
        route = 'logout/', 
        view = views.logout_view, 
        name='logout'
    ),
    path(
        route = 'signup/', 
        view = views.signup, 
        name ='signup'
    ),
    path(
        route = 'me/profile/', 
        view = views.update_profile, 
        name='update_profile'
    ),

y ya luego hay que cambiar las cosas de los templates views y middleware para que funcione la aplicación entonces

En la carpeta platzigram en middleware modifique esto;

                    if request.path not in [reverse('users:update_profile'), reverse('users:logout')]:
                        return redirect('users:update_profile')

En los template/users/update_profile.html

<form action="{% url 'users:update_profile' %}" method="POST" enctype="multipart/form-data">

En template/users/login.html se cambia en dos lineas

<form method="POST" action="{% url "users:login" %}">
<p class="mt-4">Don't have an account yet?<a href="{% url "users:signup" %}">Sign up here.</a></p>

En template/users/signup.html

<form action = "{% url 'users:signup' %}" method="POST">

En posts/views.py en la funcion create_post

return redirect('posts:feed')

y por ultimo en users/views.py se cambia en la funciones
login_view

return redirect('posts:feed')

funcion logout_view

return redirect('users:login')

funcion signup

return redirect('users:login')

y por ultimo la funcion update_profile

return redirect('users:update_profile')

Para los que usamos Visual Studio Code. En la lupa que aparece en la barra izquierda, pueden escribir palabras claves como ‘feed’, ‘login’, ‘singup’ y así poder cambiarlas por ‘posts:feed’.

Así se hace mas fácil 😄 Saludos!

Por favor no paséis esto por alto. Por cierto me parece que no se están explicando MUCHAS cosas cuando seguimos los vídeos del curso.

{% extends "base.html" %}

{% block head_content %}
<title>@{{ request.user.username }} | Platzigram</title>
{% endblock %}

{% block container %}

    <div class="container mb-5" style="margin-top: 8em;">
        <div class="row">
            <div class="col-sm-4 d-flex justify-content-center">
                <img src="{{ request.user.profile.picture.url }}" alt="@{{ request.user.username}}" class="rounded-circle" width="150px" />
            </div>
            <div class="col-sm-8">
                <h2 style="font-weight: 100;">
                    {{ request.user.username }}
                    {% if request.user == user %}
                        <a
                            href="{% url "users:update_profile" %}"
                            class="ml-5 btn btn-sm btn-outline-info"
                        >
                            Edit profile
                        </a>
                    {% else %}
                        <a
                            href=""
                            class="ml-5 btn btn-sm btn-primary"
                        >
                            Follow
                        </a>
                    {% endif %}
                </h2>
                <div class="row mt-2" style="font-size: 1.2em">
                    <div class="col-sm-4">
                        <b>{{ request.user.profile.posts_count }}785</b> posts
                    </div>
                    <div class="col-sm-4">
                        <b>{{ request.user.profile.followers }}1,401</b> followers
                    </div>
                    <div class="col-sm-4">
                        <b>{{ request.user.profile.following }}491</b> following
                    </div>
                </div>
                <div class="row mt-4">
                    <div class="col-sm-12">
                        <p>{{ request.user.profile.biography }}</p>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <hr>

{% endblock %}

Minuto 6:51 una obra de arte

Me habia surgido la duda de cuando deberiamos usar class based views y cuando function based views y encontre esto:

ademas la pag lo explica bastante bien
https://medium.com/@ksarthak4ever/django-class-based-views-vs-function-based-view-e74b47b2e41b

EL objectivo de las Class-based views es evitar repetir tareas como mostrar un template o validar un formulario

para los que esten un poco confundidos les dejo este video 😃
https://www.youtube.com/watch?v=GeiXExIuNu8&list=PLU8oAlHdN5BmfvwxFO7HdPciOCmmYneAB&index=28

Tengo éste error, me gustaría saber cómo solucionarlo.
NoReverseMatch at /users/login/
Reverse for ‘update_profile’ not found. ‘update_profile’ is not a valid view function or pattern name.

Hola, como va?
A alguien más le pasa que cuando da al boton de logout lo lleva al detail?? Y si es asi como se soluciona??

Si tienen problemas con alguna configuracion por cambiar las URLS

Recuerden modificar en:

  • Los links de los FORMS en sus vistas HTML
  • Middleware por la funcion REVERSE
  • En todos lados de sus templates donde tengan cualquier URL

Si usan git pueden user el commando…

git grep "palabra"

… para ver todas las coincidencias.

Recuerden tambien cambiar en settings

LOGIN_URL = 'users:login'

De lo contrario su vista de login estará rota.

Después de una hora logré introducir la variable username en el url de django:
Ejemplo:

<<a href="{% url 'users:detail' "request.user.profile.username" %}">> 

Fuentes:
https://docs.djangoproject.com/en/4.0/ref/templates/builtins/#url

This is the analog to ccbv for DRF.

https://www.cdrf.co/

Una clase complicada, me tomó un buen de tiempo poder detectar y corregir los errores con las urls, pero ya estuvo 😄

Tengo esto en mi platzigram/urls.py

urlpatterns = [

    path('admin/', admin.site.urls),

    path('', include(('posts.urls', 'posts'), namespace='posts')),
    path('users/', include(('users.urls', 'users'), namespace='users')),

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

esto en users/urls.py

"""Users URLs."""

# Django
from django.urls import path
from django.views.generic import TemplateView

# View
from users import views


urlpatterns = [

    # Posts
    path(
        route='<str:username>/',
        view=TemplateView.as_view(template_name='users/detail.html'),
        name='detail'
    ),

    # Management
    path(
        route='users/login/',
        view=views.login_view,
        name='login'
    ),
    path(
        route='users/logout/',
        view=views.logout_view,
        name='logout'
    ),
    path(
        route='users/signup/',
        view=views.signup,
        name='signup'
    ),
    path(
        route='users/me/profile/',
        view=views.update_profile,
        name='update_profile'
    )

]

esto en posts/urls.py

"""Post urls."""


# Django
from django.urls import path

# Views
from posts import views


urlpatterns = [

    path(
        route='',
        view=views.list_posts,
        name="feed"
    ),
    path(
        route='posts/new',
        view=views.create_post,
        name="create_post"
    ),

]

y todos mis templates ya tienen el namespace correcto:

{% url 'users:signup' %}
{% url 'users:login' %}

etc.

sin embargo me manda el siguiente error:

Using the URLconf defined in platzigram.urls, Django tried these URL patterns, in this order:

    admin/
    [name='feed']
    posts/new [name='create_post']
    users/ <str:username> [name='detail']
    users/ users/login/ [name='login']
    users/ users/logout/ [name='logout']
    users/ users/signup/ [name='signup']
    users/ users/me/profile/ [name='update_profile']
    ^media\/(?P<path>.*)$

The current path, users/login/, didn't match any of these.

Y solamente deja de generar ese error cuando accedo a la url

localhost:8000/users/users/login

Pueden ayudarme?

Como dice el profesor pablo podemos ser tan ordenados o no como queramos, la idea es ser ordenado para que sea entendible y facilmente escalable.

hola, alguien me puede ayudar no me deja entrar al template de post net
"TemplateDoesNotExist at /posts/new/
posts/new.hTml)

Hola chicos, lo he estado buscando por internet pero no lo encuentro.
Como se podría cambiar de ubicación las carpetas de aplicaciones como posts o users,
esque las pongo en apps/posts y apps/users y se me peta todo

Cuando corro el proyecto, me lleva siempre a http://localhost:8000/users/login/?next=/ y ni siguiera me deja loguarme, no logro que me traiga las imagenes. Entiendo que tengo algun problema con el Middleware pero no doy con la solucion. He mirado todos los archivos que estan subidos en la leccion, pero aun asi no lo puedo solucionar. Alquien que me pueda ayudar con esto???

Digamos que en los path de users(users/urls.py) tienen:

path(route='users/login/',
        view= views.login_view,
         name='login'
     ),

Si en el path principal(name_project/urls.py) tienen

 path('users/', include(('users.urls','users'), namespace='users')),

Para ir a esa ruta tendran que poner users/users/login
Por eso ese espacio seria mejor que lo dejen vacio:

path('', include(('users.urls','users'), namespace='users')),```

O hagan a la inversa:
En el path principal ponen users y quitan users en los path de users



Me marca el siguiente error en la terminal, ¿alguien tiene una idea de lo que puede ser?

name = "create"
TypeError: _path() got an unexpected keyword argument 'views'

Esto tengo en View:

@login_required(login_url='users:login')
def create_posts(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('posts:user_home')
    else:
        form = PostForm()

    return render(
        request=request,
        template_name='posts/new.html',
        context={
            'form': form,
            'user': request.user,
            'profile': request.user.profile
        }
    )

y esto en posts/urls:

path(
        route = 'posts/new/',
        views =  views.create_posts,
        name = "create"
    ),

hola en la terminal me salta este error y ya me tiene have unos dias complicado ModuleNotFoundError: No module named ‘posts.urls’

buenos detuve la clase antes de que el profe lo dijera
😃

template nav

{% load static %}
<nav class="navbar navbar-expand-lg fixed-top" id="main-navbar">
    <div class="container">


        <a class="navbar-brand pr-5" style="border-right: 1px solid #efefef;" href="{% url 'posts:feed' %}"></a>
            <img src="{% static 'img/instagram.png' %}" height="45" class="d-inline-block align-top"/>
        </a>

        <div class="collapse navbar-collapse">
            <ul class="navbar-nav mr-auto">

                <li class="nav-item">
                    <a href="">
                        {% if request.user.profile.picture %}
                            <img src="{{ request.user.profile.picture.url }}" height="35" 
                            class="d-inline-block align-top rounded-circle"/>
                        {% else %}
                            <img src="{% static 'img/default-profile.png' %}" height="35" 
                            class="d-inline-block align-top rounded-circle"/>
                        {% endif %}
                    </a>
                </li>

                <li class="nav-item nav-icon">
                    <a href="{% url 'posts:create' %}">
                        <i class="fas fa-plus"></i>
                    </a>
                </li>

                <li class="nav-item nav-icon">
                    <a href="{% url 'users:logout' %}"></a>
                        <i class="fas fa-sign-out-alt"></i>
                    </a>
                </li>

            </ul>
        </div>
    </div>
</nav>

posts urls

""" Posts URLs . """

# Django
from django.urls import path

# Views
from posts import views


urlpatterns = [

    path(
        route='',
        view=views.list_posts, 
        name='feed'
        ),

    path(
        route='posts/new/', 
        view=views.create_post, 
        name='create'
        ),
]


users urls

"""Users URLs."""

# Django
from django.urls import path
from django.views.generic import TemplateView

# View
from users import views

urlpatterns = [

    # Posts
    path(
        route='<str:username>/',
        view=TemplateView.as_view(template_name='users/detail.html'),
        name='detail'
    ),

    # Management
    path(
        route='users/login/',
        view=views.login_view,
        name='login'
    ),
    path(
        route='users/logout',
        view=views.logout_view,
        name='logout'
    ),
    path(
        route='users/signup',
        view=views.signup,
        name='signup'
    ),
    path(
        route='users/me/profile',
        view=views.update_profile,
        name='update_profile'
    )
]

tuve varias errores para que volviera a funcionar, dejo el codigo como quedo funcional
platzigram urls

"""platzigram URL module"""

# Django
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path, include

urlpatterns = [

    path('admin/', admin.site.urls),

    path('', include(('posts.urls', 'posts'), namespace='posts')),
    path('users/', include(('users.urls', 'users'), namespace='users')),

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)