Mixin
: create view에는 폼이 있고, detail에는 object가 있다. detail뷰를 form과 같이 사용하고 싶을 때 사용한다.
FormMixin을 사용하면, form_class를 지정해줌으로써 detail view내에서도 form을 사용할 수 있다.
Commentapp
1.
Create View / Delete View
2.
Success_url to ralated article
3.
Model <article, writer, content, created_at>
앱 생성, 세팅 앱연결, url 라우팅
Models 작성
class Comment(models.Model):
article = models.ForeignKey(Article, on_delete=models.SET_NULL, null=Ture, related_name='comment')
writer = models.ForeignKey(User, on_delete=models.SET_NULL, null=Ture, related_name='comment')
content = models.TextField(null=False)
created_at = models.DateTimeField(auto_now=True)
Python
복사
forms 작성
class CommentCreationForm(ModelForm):
class Meta:
modle = Comment
fields = ['content']
Python
복사
작성 완료 후, 마이그레이트를 해준다.
View작성
class CommentCreateView(CreateView):
model = Comment
form_class = CommentCreationForm
template_name = 'commentapp/create.html'
def get_success_url(self): #여기서 self.object는 comment이다.
return reverse('articleapp:datail', kwargs={'pk':self.object.article.pk})
Python
복사
commetapp/templates/commentapp dir 만든 후, 내부에
create.html 만들기
<!-- base.html은 datail에서 가져오므로 지워준다. -->
{% load bootstrap4 %}
{% block content %}
<div style = "text-align: center; max-width: 600px; margin: 4rem auto">
<div class="mb-4">
<h4>Comment Create</h4>
</div>
<form action="{% url 'commentapp:create' %}" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<input type="submit" class="btn btn-dark rounded-pill col-6 mt-3">
<!-- 추후 article의 pk값을 받기 위해 미리 작성해둠 -->
<input type="hidden" name="article_pk" value="{{ article.pk }}">
</form>
</div>
{% endblock %}
HTML
복사
ArticleDatail 에 CommentCreate 연결해주기
{% include 'articleapp/create.html' with article=target_article %}
<!-- commentapp/create.html에 히든 인풋의 value에 article.pk 값을 넣어준다 -->
...value="{{ article.pk }}">
HTML
복사
FormMixin
articleapp의 ArticleDatilView에 Form을 넣어준다.
class ArticleDatailView(DetailView, FormMixin):
...
form_class = CommentCrationForm
Python
복사
CommentCreateView에 form_valid 넣기
def form_valid(self, form)
temp_comment = form.save(commit=False)
temp_comment.article = Article.get(pk=self.request.POST['article.pk'])
temp_comment.writer = self.request.user
temp_commnet.save()
return super().form_valid(form)
Python
복사
comment create.html에 보안을 추가한다.
{% if user.is_authenticated %}
...
{% else %}
<a href="{% url 'accountapp:login' %}?next={{ request.path }}"
class="btn btn-primary rounded-pill col-6 mt-3">
login
</a>
{% endif}
Python
복사