웹 서비스에서 가장 기본 기능은 CRUD이다. 우리가 일상에서 이용하는 다양한 서비스들도 사실 근본을 따져보자면 CRUD의 변주이다. django 및 MySQL로 웹 개발의 근간이 되는 CRUD를 간략화하여 구현해보았다.
<참조글>
django & mysql 연동하기 기본 설정 방법
이때까지 django로 프로젝트를 만들 때 기본 내장된 sqlite만 사용해봐서 mysql을 연동하는 데 꽤 애를 먹었다. 다음 글을 차근차근 따라하여 기본적인 세팅을 마치고, 데이터베이스를 응용해서 보
gdk01.tistory.com
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 기능을 사용할 수 있도록 구현해놓은 코드이다. 용도에 맞게 잘 수정하여 활용하길 바란다.
'👩💻 Programming > Python' 카테고리의 다른 글
| 코딩테스트 입문자를 위한 파이썬(Python) 기초 문법 (0) | 2022.12.01 |
|---|---|
| django with MySQL로 회원가입 및 로그인 기능 구현하기 (0) | 2022.06.03 |
| django & mysql 연동하기 기본 설정 방법 (0) | 2022.06.01 |
댓글