회신이 여러 게시물에 대한 답글이 될 수있는 경우가 아니면 ManyToManyField
은 원하는 것이 아닙니다.
class Discussion(models.Model):
message = models.TextField()
reply_to = models.ForeignKey('self', related_name='replies',
null=True, blank=True)
그럼 당신은 Discussion.replies
와 토론의 답변을 얻을 수 있습니다 : 당신은 단지 ForeignKey
가 필요합니다.
불행히도 Django의 템플릿 언어에서 재귀를 수행 할 방법이 없으므로 1) 재귀 함수를 실행하여 응답의 "병합 된"목록을 가져온 다음 문맥에 넣거나 2)
이
_DiscussionTemplate = Template("""
<li>{{ discussion.message }}{% if replies %}
<ul>
{% for reply in replies %}
{{ reply }}
{% endfor %}
</ul>
{% endif %}</li>
""".strip())
class Discussion(models.Model):
message = models.TextField()
reply_to = models.ForeignKey('self', related_name='replies',
null=True, blank=True)
@property
def html(self):
return _DiscussionTemplate.render(Context({
'discussion': self,
'replies': [reply.html() for reply in self.replies.all()]
}))
그런 다음 최상위 템플릿에, 당신은 단지 필요 :
이
<ul>
{% for d in discussions %}
{{ d.html }}
{% endfor %}
</ul>
CSS를 적용처럼 호출 할 수있는 기능은 반복적으로 그 일을 보일 것이다 각 레벨을 생성하는 템플릿을 사용 멋지게 보이도록 원하는대로.
편집 : 루트 토론은 Discussion.objects.filter(reply_to=None)
입니다. 모든 코드 (_DiscussionTemplate
포함)는 models.py
에 있습니다. 이렇게하면 모듈이로드 될 때 _DiscussionTemplate
이 한 번 초기화됩니다.
EDIT 2 : HTML을 템플릿 파일에 넣는 것은 매우 간단합니다.
_DiscussionTemplate = loader.get_template("discussiontemplate.html")
그런 다음
discussiontemplate.html
를 만들 :에
_DiscussionTemplate
를 설정하는 뷰 코드 변경 필요에 따라
<li>{{ discussion.message }}{% if replies %}
<ul>
{% for reply in replies %}
{{ reply }}
{% endfor %}
</ul>
{% endif %}</li>
는 템플릿 파일의 경로를 설정합니다.
_DiscussionTemplate은 어디로 이동합니까? 그것은 내 모델에 있습니까? 템플릿을 가져와야합니까? – dotty
symmetrical = False 오류가 발생하여 제거 했으므로 여전히 작동합니까? – dotty
루트 토론이 무엇인지 어떻게 알 수 있습니까? – dotty