4

Resolver Reto y problemas de la clase Protegiendo la vista de perfil, Detail view y List view

Para resolver el reto lo hice de la siguiente manera:

VER POSTS EN DETALLE

NOTA: asegurate de colocar las rutas correctament de los html, para no tener errores.
por ejemplo

Esto
<form class="justify-content-center text-center" method="POST" action="{% url "users:login" %}">
en vez de esto
<form class="justify-content-center text-center" method="POST" action="{% url "login_view" %}">

1 -> Para ver un post específico hize una ruta en users/urls.py

    path(
        route='<str:username>/<int:id>/',
        view=views.PostDetailView.as_view(),
        name='detailpost'
    ),

Luego de eso hice la vista en users/views.py

classPostDetailView(LoginRequiredMixin, DetailView):

    template_name = 'users/detailpost.html'
    slug_field = 'id' 
    slug_url_kwarg = 'id
    queryset = Post.objects.all()
    context_object_name = 'post' 
    defget_context_data(self, **kwargs):
        """ Add user's posts to context """context = super().get_context_data(**kwargs)
        post= self.get_object()
        context['posts'] = Post.objects.get(id=post.id)

        returncontext

El html es este:

{% extends "base.html" %}{% block head_content %}<title>Platzigramtitle>
{% endblock%}{% block container %}<divclass="container"><divclass="row"><divclass="col-sm-12col-md-8offset-md-2mt-5p-0post-container"><divclass="mediapt-3pl-3pb-1"><ahref="{% url 'users:detail' post.user.username %}"><imgclass="mr-3rounded-circle"height="35"src="{{ post.profile.picture.url }}"
                        alt="{{ post.user.get_full_name }}">
                a>
                <divclass="media-body"><pstyle="margin-top:5px;">{{ post.user.get_full_name }}p>
                div>
            div>

            <imgstyle="width:100%;"src="{{ post.photo.url }}"alt="{{ post.title }}"><pclass="mt-1ml-2"><ahref=""style="color: #000; font-size:20px;"><iclass="farfa-heart">i>
                a> 30 likes
            p>
            <pclass="ml-2mt-0mb-2"><b>{{ post.title }}b> - <small>{{ post.created }}small>
            p>
            {% if post.user.username == user.username %}<ahref="{% url 'posts:edit' post.user.username post.id %}"class="btn btn-primary stretched-link">Editar Tituloa>
            {% else %}{% endif %}

        div>
    div>
div>
{% endblock %}

y en detail.html coloque la ruta para que cuando presione una imagen lo lleve a ver el post en detalle

<divclass="container"id="user-posts"><divclass="rowmt-3">{% for post in posts %}<divclass="col-sm-4pt-5pb-5pr-5pl-5d-flexjustify-content-centeralign-items-center"><ahref="{% url 'users:detailpost' request.user.username post.id %}"class="border"><imgsrc="{{ post.photo.url }}"alt="{{ post.title }}"class="img-fluid" />
            a>
        div>
        {% endfor %}
    div>
div>

EDITAR POSTS
Para este tienes que hacer una nuevo path en posts/urls.py


    path(
        route='<string:username>/<int:id>/',
        view=views.editPost,
        name='edit'
    )

hacemos la correspondiente vista, en este caso enviamos los argumento de la url junto
con el objeto request

defeditPost(request, username, id):
    print(username, id)
    post = Post.objects.get(id=id)
    profile = request.user.profileif request.method == 'POST':
        form = UpdatePostForm(request.POST)
        ifform.is_valid():
            data = form.cleaned_data
            post.title = data['title']
            post.save()

            url = reverse('users:detail', kwargs={'username':request.user.username})
            return redirect(url)
    else: 
        form = UpdatePostForm()

    return render(
        request=request,
        template_name='posts/editPost.html',
        context={
            'profile': profile,
            'user': request.user,
            'post': id,
            'form':form
        }

para editar un post , en este caso solo deje para editar el titulo, entonces hice un nuevo form en posts/forms.py


classUpdatePostForm(forms.ModelForm):
    """ Post model form. """

    classMeta:
        """ Form settings """
        model = Post
        fields = ('user', 'profile', 'title')

EL html es el sigueinte va en templates/posts/editPost.html

{% extends "base.html" %}{% block head_content %}<title>Create new posttitle>
{% endblock %}{% block container %}<divclass="container"><divclass="rowjustify-content-md-center"><divclass="col-6pt-3pb-3"id="profile-box"><h4class="mb-4">Update Informationh4>

            <formmethod="POST"enctype="multipart/form-data"action="{% url 'posts:edit' user post %}">{% csrf_token %}<inputtype="hidden"name="user"value="{{ user.pk}}" /><inputtype="hidden"name="profile"value="{{ profile.pk }}" />{# Title field #}<divclass="form-group"><inputclass="form-control{% if form.title.errors %}is-invalid{% endif %}"type="text"name="title"placeholder="Title"><divclass="invalid-feedback">{% for error in form.title.errors %}{{ error }}{% endfor %}
                    div>
                div>

                <buttontype="submit"class="btnbtn-primarybtn-blockmt-5">Updatebutton>
            form>
        div>
    div>
div>

{% endblock %}

y ya con ese debería funcionar, espero poder haberles ayudadó!!!

Escribe tu comentario
+ 2