본문 바로가기
👩‍💻 Programming/Python

django with MySQL 게시글 CRUD 구현하기

by codingBear 2022. 6. 3.
728x90
반응형

 웹 서비스에서 가장 기본 기능은 CRUD이다. 우리가 일상에서 이용하는 다양한 서비스들도 사실 근본을 따져보자면 CRUD의 변주이다. django 및 MySQL로 웹 개발의 근간이 되는 CRUD를 간략화하여 구현해보았다.

 

<참조글>

https://gdk01.tistory.com/86

 

django & mysql 연동하기 기본 설정 방법

 이때까지 django로 프로젝트를 만들 때 기본 내장된 sqlite만 사용해봐서 mysql을 연동하는 데 꽤 애를 먹었다. 다음 글을 차근차근 따라하여 기본적인 세팅을 마치고, 데이터베이스를 응용해서 보

gdk01.tistory.com

https://gdk01.tistory.com/88

 

django with MySQL로 회원가입 및 로그인 기능 구현하기

 django에서 기본적으로 제공하는 User 클래스를 활용하면 회원가입, 로그인, 로그아웃을 비롯하여 회원 인증 기능까지 추가적인 코드 작성 없이 간단히 구현할 수 있다. 다음 코드를 참고하여 자

gdk01.tistory.com


# feed/urls.py

from django.urls import path
from . import views

app_name = "feed"

urlpatterns = [
    path("", views.allFeeds, name="all_feeds"),
    path("feed/<int:feed_id>", views.show, name="show"),
    path("create", views.create, name="create"),
    path("edit/<int:feed_id>", views.edit, name="edit"),
    path("delete/<int:feed_id>", views.delete, name="delete"),
]

# feed/models.py

from django.db import models
from user.models import User

# Create your models here.
class Feed(models.Model):
    author = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="feed_author"
    )
    title = models.CharField(max_length=100, blank=True, null=False)
    content = models.TextField(max_length=1000, blank=True, null=False)
    imageUrl = models.TextField(blank=True)
    createdTime = models.DateTimeField(
        null=True, blank=True, auto_now=False, auto_now_add=True
    )
    updatedTime = models.DateTimeField(
        null=True, blank=True, auto_now=True, auto_now_add=False
    )
    like = models.ManyToManyField(User, blank=True, related_name="feed_like")

# feed/views.py

from django.shortcuts import render, redirect

from .models import User, Feed


def allFeeds(request):
    feeds = Feed.objects.all()
    return render(request, "feed/feeds.html", {"feeds": feeds})


def show(request, feed_id):
    feed = Feed.objects.get(pk=feed_id)
    return render(request, "feed/feed.html", {"feed": feed})


def create(request):
    if request.user.is_authenticated:
        user = User.objects.get(id=request.user.id)

        if request.method == "POST":
            title = request.POST["create_title"]
            content = request.POST["create_content"]
            imageUrl = request.POST["create_imageUrl"]

            feed = Feed(
                author=user,
                title=title,
                content=content,
                imageUrl=imageUrl,
            )

            feed.save()
            return redirect("feed:all_feeds")
        return render(request, "feed/create.html")
    else:
        return render(request, "user/login.html")


def edit(request, feed_id):
    if request.user.is_authenticated:
        feed = Feed.objects.get(pk=feed_id)

        if request.method == "POST":
            title = request.POST["title"]
            content = request.POST["content"]
            imageUrl = request.POST["imageUrl"]

            feed.title = title
            feed.content = content
            feed.imageUrl = imageUrl

            feed.save()
            return redirect("feed:all_feeds")
        return render(request, "feed/edit.html", {"feed": feed})
    else:
        return render(request, "user/login.html")


def delete(request, feed_id):
    if request.user.is_authenticated:
        feed = Feed.objects.get(pk=feed_id)

        if request.method == "POST":
            feed.delete()
            return redirect("feed:all_feeds")
        return render(request, "feed/editFeed.html", {"feed": feed})
    else:
        return render(request, "user/login.html")

# feed/templates/feed/feeds.html

{% extends "main/layout.html" %} 
{% block main %}
  {% if user.is_authenticated %}
  <ul>
    {% for feed in feeds %}
      <li>
        <a href="{% url 'feed:show' feed.id %}">
          {{ feed.title }} by {{ feed.author}}
        </a>
      </li>
    {% endfor %}
  </ul>
  <a href="{% url 'feed:create' %}">create your feed!</a>
  <a href="{% url 'main:index' %}">return to main page</a>
  {% endif %}
{% endblock %}

# feed/templates/feed/feed.html

{% extends "main/layout.html" %} 
{% block main %}
  {% if user.is_authenticated %}
    <div>title: {{ feed.title }}</div>
    <div>author: {{ feed.author }}</div>
    <div>created time: {{ feed.createdTime }}</div>
    <div>content: {{ feed.content }}</div>
    {% if user.id == feed.author.id %}
      <a href="{% url 'feed:edit' feed.id %}">edit this feed</a>
      <form
        action="{% url 'feed:delete' feed.id %}"
        method="POST"
        style="display: flex; flex-direction: column"
      >
        {% csrf_token%}
        <input type="submit" value="delete this page" />
      </form>
    {% endif %}
  {% endif %}
{% endblock %}

# feed/templates/feed/create.html

{% extends "main/layout.html" %} 
{% block main %}
  {% if user.is_authenticated%}
    <form 
      action="{% url 'feed:create' %}" 
      method="POST" 
      style="display: flex; flex-direction: column"
    >
      {% csrf_token%}
      <input type="text" name="create_title" placeholder="title" />
      <textarea name="create_content" placeholder="content"></textarea>
      <input type="text" name="create_imageUrl" placeholder="image URL" />
      <input type="submit" value="create feed" />
    </form> 
  {% endif %}
{% endblock %}

# feed/templates/feed/edit.html

{% extends "main/layout.html" %} 
{% block main %}
  {% if user.is_authenticated%}
    {% if user.id == feed.author.id %}
        <form
        action="{% url 'feed:edit' feed.id %}"
        method="POST"
        style="display: flex; flex-direction: column"
      >
        {% csrf_token%}
        <input 
          type="text" 
          name="title" 
          placeholder="title" 
          value="{{ feed.title }}"/>
        <textarea name="content" placeholder="content">{{ feed.content }}</textarea>
        <input 
          type="text" 
          name="imageUrl" 
          placeholder="image URL" 
          value="{{ feed.imageUrl }}"/>
        <input type="submit" value="update" />
      </form>
      
      <a href="{% url 'feed:all_feeds' %}">return to feeds page</a>
    {% endif %}
  {% endif %}
{% endblock %}

 기본적인 글 제목, 글 내용, 이미지 url을 등록하여 db에서 꺼내오고 user의 id와 작성자의 id가 일치하면 edit 및 delete 기능을 사용할 수 있도록 구현해놓은 코드이다. 용도에 맞게 잘 수정하여 활용하길 바란다.

728x90
반응형

댓글