여름의 서재

[Django] 게시글에 User 정보 넣기_Article-User 본문

Skill/Django

[Django] 게시글에 User 정보 넣기_Article-User

엉아_ 2021. 10. 22. 01:44
728x90

💡 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 %}

<!--생략-->

 

Comments