댓글 기능 구현을 위해 필요한 Article-User 관계 설정하는 법에 대해 알아보자.
Django에서 User 모델을 참조하는 방법
settings.AUTH_USER_MODEL
get_user_model()
# articles/models.py
from django.conf import settings
class Article(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
...
$ python manage.py makemigrations
You are trying to add a non-nullable field 'users' to article without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
Select an option:
Please enter the default value now, as valid Python
The datetime and django.utils.timezone modules are available, so you can do e.g. timezone.now
Type 'exit' to exit this prompt
>>>
$ python manage.py migrate
settings.AUTH_USER_MODEL
get_user_model()
# articles/forms.py
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ('title', 'content',)
확인 후 게시글 작성하기
외래 키 데이터 누락으로 인한 에러 발생
NOT NULL constraint failed: articles_article.users_id
게시글 작성시 작성자 정보가 함께 저장될 수 있도록 save의 commit 옵션 활용
# articles/views.py
def create(request):
if request.method == 'POST':
form = ArticleForm(request.POST, request.FILES)
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)
# articles/views.py
def delete(request, pk):
article = Article.objects.get(pk=pk)
if request.user.is_authenticated:
if request.user == article.user:
article.delete()
return redirect('articles:index')
return redirect('articles:index')
def update(request, pk):
article = Article.objects.get(pk=pk)
if request.user == article.user:
if request.method == 'POST':
form = ArticleForm(request.POST, request.FILES, instance=article)
if form.is_valid():
form.save()
return redirect('articles:detail', pk=article.pk)
else:
form = ArticleForm(instance=article)
else:
return redirect('articles:index')
context = {'form': form, 'article': article}
return render(request, 'articles/update.html', context)
<!-- articles/detail.html -->
{% if request.user == article.user %}
<a href="{% url 'articles:update' article.pk %}">수정하기</a>
<form action="{% url 'articles:delete' article.pk %}" id="delete-form">
{% csrf_token %}
<input type="submit" value="삭제하기" id="delete-btn" />
</form><br>
{% endif %}
<!-- articles/detail.html -->
<p><b>작성자 : {{ article.user }}</b></p>
<p>글 제목 : {{article.title}}</p>
<p>글 내용 : {{article.content}}</p>
<p>생성시각 : {{article.created_at}}</p>
<p>수정시각 : {{article.updated_at}}</p>
<!-- articles/index.html -->
{% extends 'base.html' %}
{% block content %}
<h1>INDEX</h1>
<a href="{% url 'articles:create' %}">작성하기</a>
<hr />
{% for article in articles %}
<p>
<p><b>작성자 : {{ article.user }}</b></p>
[{{article.id}}] <a href="{% url 'articles:detail' article.pk %}" id="article-title">{{article.title}}</a>
</p>
<hr />
{% endfor %}
{% endblock content %}