여름의 서재
[Django] 게시글에 User 정보 넣기_Article-User 본문
💡 Article과 User는 무슨 관계일까?
: 한 명이 여러개의 게시글을 작성할 수 있다. 하지만 한 게시글을 여러명이 작성할 수는 없다.
즉, Article과 User는 N:1 관계를 가진다.
🔧 게시글에 User 정보 넣기
1. articles/models.py
: Article 테이블에 user 테이블과 N:1 관계를 형성하는 user 필드(ForeignKey)를 넣는다.
여기서, user 필드는 user 모델을 직접 참조하지 않고, settings.AUTH_USER_MODEL 을 이용해야 한다.
📌 settings.AUTH_USER_MODEL ? get_user_model()?
: 둘다 User 모델을 가르킨다. settings.AUTH_USER_MODEL은 models.py에서 User모델을 참조할때 사용하고, get_user_model()은 models.py가 아닌 모든 곳에서 사용!
from django.db import models
from django.conf import settings
# Create your models here.
class Article(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
title = models.CharField(max_length=10)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
2. migrations & migrate
: DB 테이블을 변경해줬으니 migrate는 필수!!
python manage.py migrations
python manage.py migrate
3. articles/forms.py
: 게시글을 작성하는 폼을 커스텀해보자. 게시글 작성시 user필드가 보이지 않도록 수정해야 한다.
(만약 user 필드가 보이게 된다면 게시글을 작성하는 작성자를 선택하는 기이한 현상이 발생한다..😦)
from django import forms
from .models import Article, Comment
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
# fields = '__all__'
fields = ('title', 'content',)
4. articles/views.py
📌 create (게시글 작성 함수)
: create 함수에서 게시글을 저장하기 전에 user정보를 담도록 코드를 바꿔야 한다.
(이때, article = form.save() -> 이렇게 바로 저장하면 필수로 들어가야하는 user값이 안 들어간 상황이기 때문에 에러가 난다)
⭐ save(commit=flase)를 하면 데이터를 데이터베이스에 당장 저장하지 않는다.
DB에 데이터를 저장하기 전에 특정 행위를 하고 싶을 때 사용한다.
📌 delete (게시글 삭제 함수) & update (게시글 수정 함수)
: 게시글을 작성한 사람만이 그 게시글을 수정, 삭제할 수 있도록 해야 한다.
request.user이 article.user와 같을 때만 삭제 함수를 실행시킨다.
@login_required
@require_http_methods(['GET', 'POST'])
def create(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
article = form.save(commit=False)
article.user = request.user
article.save()
return redirect('articles:detail', article.pk)
else:
form = ArticleForm()
context = {
'form': form,
}
return render(request, 'articles/create.html', context)
@require_POST
def delete(request, pk):
article = get_object_or_404(Article, pk=pk)
if request.user.is_authenticated:
if request.user == article.user:
article.delete()
return redirect('articles:index')
return redirect('articles:detail', article.pk)
@login_required
@require_http_methods(['GET', 'POST'])
def update(request, pk):
article = get_object_or_404(Article, pk=pk)
if request.user == article.user:
if request.method == 'POST':
form = ArticleForm(request.POST, instance=article)
if form.is_valid():
form.save()
return redirect('articles:detail', article.pk)
else:
form = ArticleForm(instance=article)
else:
return redirect('articles:index')
context = {
'article': article,
'form': form,
}
return render(request, 'articles/update.html', context)
5. articles/detail.html
: 해당 게시글의 작성자만 update 버튼과 delete 버튼이 보이도록 수정한다.
<!--생략-->
{% if user == article.user %}
<a href="{% url 'articles:update' article.pk %}">[UPDATE]</a>
<form action="{% url 'articles:delete' article.pk %}" method="POST">
{% csrf_token %}
<input type="submit" value="DELETE">
</form>
{% endif %}
<!--생략-->
'Skill > Django' 카테고리의 다른 글
[Django] 좋아요 기능 구현하기_Like (1) | 2021.10.24 |
---|---|
[Django] 댓글 기능 구현하기_Comment (0) | 2021.10.22 |
[Django] User model 커스텀하기 (0) | 2021.10.22 |
[Django] Auth 정복하기(3)_Update & Delete (0) | 2021.09.26 |
[Django] Auth 정복하기(2)_Login & Logout (0) | 2021.09.26 |