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ó!!!