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 鈥榝eed鈥, 鈥榣ogin鈥, 鈥榮ingup鈥 y as铆 poder cambiarlas por 鈥榩osts: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 鈥榰pdate_profile鈥 not found. 鈥榰pdate_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 鈥榩osts.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)