Django 포스팅 detail view 구현

2022. 2. 14. 17:21카테고리 없음

반응형

출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!

 


 

Django 포스팅 detail view 구현하기

#insta/urls.py

from django.urls import path
from . import views

app_name = 'insta'

urlpatterns = [
    path('post/new', views.post_new, name='post_new'),
    path('post/<int:pk>', views.post_detail, name='post_detail'),
    ]

 

 

#insta/views.py

from django.shortcuts import redirect, get_object_or_404


# 포스팅 detail
def post_detail(request, pk):
    # 해당 pk의 포스팅 객체가 없을 경우 404 에러 반환
    post = get_object_or_404(Post, pk=pk)
    return render(request, "insta/post_detail.html", {
        "post" : post,
    })

# 항상 디테일을 구현하면 관련 모델에 get_absolute_url을 지정해주어야한다.

#insta/models.py

class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    photo = models.ImageField(upload_to="insta/post/%Y%m%d")
    # 내용
    caption = models.TextField()
    tag_set = models.ManyToManyField('Tag', blank=True)
    location = models.CharField(max_length=100) 

	# detail view
    def get_absolute_url(self):
        return reverse("insta:post_detail", args=[self.pk])

# 만약 이름으로 접근하게 되면 이름 형태로 반환해주게끔 accounts/models.py에서 설정해준다.

 

    @property
    def name(self):
        return f"{self.first_name} {self.last_name}"

 

# 유저가 프로필이 있으면, 유저의 프로필을 보여주고, 없으면 기본 프로필을 보여주는 함수를 accounts/models.py에서 설정해준다.

    # profile이 있는지 검사하고 알맞은 값을 반환하는 로직
    @property
    def profile_url(self):
        if self.profile:
            return self.profile.url
        else:
            return resolve_url('pydenticon_image', self.username)

 

 

 

#insta/templates/insta/post_detail.html

{% extends "insta/layout.html" %}
{% load bootstrap4 %}

{% block content %}
    <div class="container">
        <div class="row">
            <div class="col-sm-12">
                <div class="card">
                    <div class="card-header">    
                        <img src= "{{ user.profile_url }}" style="width: 24px; height: 24px;"/>
                        {{ post.author }}                    
                    </div>
                    <div class="card-body">   
                        {% if post.photo.url %}
                            <img src="{{ post.photo.url  }}" style="width: 100%;"/>
                        {% endif %}                     
                    </div>
                    <div class="card-footer">                           
                        {% for tag in post.tag_set.all %}
                            <span class="badge badge-primary" style="color: #fff;
                            background-color: #007bff;">                        
                                #{{ tag.name }}
                            </span>
                        {% endfor %}                     
                    </div>
                </div>    
            </div>
        </div>
    </div>  
{% endblock %}

 

 

 

 

 

 

 

반응형