Django contrib Comments 댓 글 모듈 기반(상세 설명)
이 플러그 인 은 models 에 댓 글 을 추가 할 수 있 기 때문에 블 로그 글,그림,책 장절 또는 다른 모든 것 에 댓 글 을 추가 하 는 데 자주 사 용 됩 니 다.
1.빠 른 입문
빠 른 사용 절차:
설치 패키지:pip install django-contrib-comments
django settings 에 있 는 INSTALLEDAPPS 에'django.contrib.sites'를 추가 하여 app 등록 을 하고 SITE 를 설정 합 니 다.ID 값.
django settings 에 있 는 INSTALLEDAPPS 에'django 추가comments'.
manage.py migrate 를 실행 하여 댓 글 데이터 시트 를 만 듭 니 다.
프로젝트 의 루트 urls.py 파일 에 URL:url(r'^comments/',include('djangocomments.urls')),
comment 의 템 플 릿 탭 을 사용 하여 템 플 릿 에 댓 글 을 삽입 합 니 다.
1.1 comment 템 플 릿 태그
사용 하기 전에 라벨 을 로드 하 십시오:
{% load comments %}
1.1.1 댓 글 대상두 가지 방법 이 있다.
1.댓 글 대상 을 직접 인용한다.템 플 릿 에 entry 라 는 댓 글 대상 이 있다 고 가정 하면 다음 방법 으로 대상 의 댓 글 횟수 를 얻 을 수 있 습 니 다.
{% get_comment_count for entry as comment_count %}
2.대상 의 유형 과 id 를 사용 하여 참조 합 니 다.예 를 들 어 블 로그 의 entry id 가 14 라 는 것 을 알 고 있 으 면 이렇게 할 수 있 습 니 다.
{% get_comment_count for blog.entry 14 as comment_count %}
1.1.2 댓 글 보 여주 기render 사용comment_list 혹은 getcomment_list 태그 로 댓 글 을 보 여 줍 니 다.
댓 글 빠르게 보 여주 기:
{% render_comment_list for [object] %}
이것 은 플러그 인 에 있 는 comments/list.html 템 플 릿 을 사용 하여 댓 글 의 html 코드 를 생 성 합 니 다.사용자 정의 디 스 플레이 댓 글:
{% get_comment_list for [object] as [varname] %}
실례:
{% get_comment_list for event as comment_list %}
{% for comment in comment_list %}
...
{% endfor %}
이러한 방식 에서 당신 은 css,js 를 추가 하고 boottstrap 과 결합 하 는 등 comment 의 전시 방식 을 스스로 제어 할 수 있 습 니 다.1.1.3 댓 글 에 하이퍼링크 추가
get 사용comment_permalink 탭 은 댓 글 에 영구적 인 하이퍼링크 를 추가 합 니 다.사용법:
{% get_comment_permalink comment_obj [format_string] %}
기본 적 인 상황 에서 url 의 이름 닻 은 알파벳'c'에 댓 글 id 로 구성 된다.c82물론 다음 방식 으로 사용자 정의 할 수도 있 습 니 다.
{% get_comment_permalink comment "#c%(id)s-by-%(user_name)s"%}
python 표준 포맷 문자열 을 사용 합 니 다.사용자 정의 여부 와 상 관 없 이 템 플 릿 의 적당 한 위치 에 닻 이름 에 맞 는 메커니즘 을 제공 해 야 합 니 다.예 를 들 면:
{% for comment in comment_list %}
<a name="c{{ comment.id }}"></a>
<a href="{% get_comment_permalink comment %}">
permalink for comment #{{ forloop.counter }}
</a>
...
{% endfor %}
이 내용 은 safari 브 라 우 저 를 사용 할 때 bug 가 있 을 수 있 습 니 다.1.1.4 댓 글 수
댓 글 가 져 오기 수량:
{% get_comment_count for [object] as [varname] %}
예 를 들 면:
{% get_comment_count for entry as comment_count %}
This entry has {{ comment_count }} comments.
1.1.5 댓 글 리스트render 사용comment_form 혹은 getcomment_form 은 페이지 에 댓 글 을 입력 하 는 폼 을 표시 합 니 다.
폼 빠르게 보이 기:
{% render_comment_form for [object] %}
기본 comments/form.html 템 플 릿 을 사 용 했 습 니 다.쉽게 말 하면 바보 식,가장 못 생 긴 화면 이다.사용자 정의 폼:
get 사용comment_form 탭 에서 form 대상 을 가 져 온 다음 논리 적 으로 보 여 주 는 방식 을 제어 합 니 다.
{% get_comment_form for [object] as [varname] %}
예 를 보 여 주세요(물론 이것 도 못 생 겼 어 요!):
{% get_comment_form for event as form %}
<table>
<form action="{% comment_form_target %}" method="post">
{% csrf_token %}
{{ form }}
<tr>
<td colspan="2">
<input type="submit" name="submit" value="Post">
<input type="submit" name="preview" value="Preview">
</td>
</tr>
</form>
</table>
제출 주소:위의 예 는 하나의 comment 를 통 해form_target 탭 은 form 폼 에 올 바른 댓 글 내용 제출 주 소 를 지정 하 였 습 니 다.이 방법 을 사용 하 십시오.
<form action="{% comment_form_target %}" method="post">
제출 후 주소 변경:사용자 가 댓 글 을 달 고 페이지 를 다른 주소 로 바 꾸 려 면 form 에 숨겨 진 input 탭 을 삽입 하고 next 라 고 명명 하 십시오.다음 과 같 습 니 다.
<input type="hidden" name="next" value="{% url 'my_comment_was_posted' %}" />
인 증 된 사용자 에 게 다른 폼 을 제공 합 니 다:많은 경우 에 저 희 는 로그 인 한 인증 사용자 에 게 익명 사용자 와 다른 내용 을 제공 해 야 합 니 다.예 를 들 어 이름,메 일,사이트 주소 등 은 사용자 데이터 와 정보 표 에서 얻 을 수 있 습 니 다.사실 현재 대부분의 사이트 에서 도 인증 사용자 만 댓 글 을 달 수 있다.이 를 위해 서 는 사용자 정 보 를 간단하게 보 여주 거나 form 폼 을 수정 하면 됩 니 다.예 를 들 어:
{% if user.is_authenticated %}
{% get_comment_form for object as form %}
<form action="{% comment_form_target %}" method="POST">
{% csrf_token %}
{{ form.comment }}
{{ form.honeypot }}
{{ form.content_type }}
{{ form.object_pk }}
{{ form.timestamp }}
{{ form.security_hash }}
<input type="hidden" name="next" value="{% url 'object_detail_view' object.id %}" />
<input type="submit" value=" " id="id_submit" />
</form>
{% else %}
<p> <a href="{% url 'auth_login' %}"> </a> .</p>
{% endif %}
상례 의 허 니 팟(꿀단지,공격 자 를 속 이 는 기술)은 사용자 가 볼 수 있 기 때문에 CSS 를 이용 하여 숨겨 야 한다.
#id_honeypot {
display: none;
}
익명 의 댓 글 을 동시에 받 고 싶다 면 위의 else 를 문장 뒤의 코드 에서 표준 댓 글 양식 으로 수정 하면 된다.1.1.6 댓 글 표 주의사항
이 플러그 인의 댓 글 양식 에는 중요 한 반 쓰레기 메커니즘 이 있 습 니 다.특히 주의해 야 합 니 다.
form 에는 댓 글 대상 의 시간 스탬프,정보 등 숨겨 진 도 메 인 이 포함 되 어 있 고 정 보 를 검증 하 는 안전 한 해시 도 포함 되 어 있 습 니 다.호 의 를 갖 지 않 은 사람 이 이 데 이 터 를 조작 하면 논평 은 거부 된다.사용자 정의 form 을 사용 하면 이 필드 들 이 그대로 인용 되 었 는 지 확인 하 십시오.
타임 스탬프 는'회복 공격'이 오래 지속 되 지 않도록 하 는 데 사 용 됩 니 다.요청 폼 과 제출 폼 의 시간 차 가 너무 긴 사용자 들 은 댓 글 제출 을 거부 합 니 다.(주:관 서 는 댓 글 제출 에 시간 제한 요구 가 있다 는 뜻 입 니까?)
평론 표 에는 honey pot 필드 가 있 습 니 다.이 도 메 인 이 모든 데 이 터 를 채 우 면 이 댓 글 은 제출 이 거부 되 는 함정 입 니 다.쓰레기 발송 자 는 폼 의 모든 도 메 인 에 일정한 데 이 터 를 자동 으로 입력 하고 보기 로 합 법 적 으로 합 격 된 제출 데이터 시트 를 만 듭 니 다.
기본 폼 의 위 도 메 인 은 CSS 를 통 해 숨 기 고 경 고 를 제공 합 니 다.사용자 정의 폼 이 라면 같은 작업 을 했 는 지 확인 하 세 요!
마지막 으로 이 플러그 인의 방어 체 제 는 django 의 csrf 미들웨어 에 의존 합 니 다.열 려 있 는 지 확인 하 십시오!그렇지 않 으 면 csrf 를 사용 하 세 요protect 장식 기 는 모든 댓 글 폼 을 사용 하 는 views 를 장식 합 니 다.
2.리 뷰 모델
원형:class djangocomments.models.Comment
다음 필드 를 포함 합 니 다:
content_object
평론 의 대상,예 를 들 어 블 로그,사진,글 등 이다.이것 은 Generic ForeignKey 외 키 입 니 다.
content_type
댓 글 대상 을 저장 하 는 데 사용 할 ContentType 을 가리 키 는 외부 키위의 object 와 구별 해 야 합 니 다.
object_pk
대상 의 메 인 키.TextField 필드
site
댓 글 제출 사이트.외부 키.
user
댓 글 을 가리 키 는 사용자 의 외부 키 입 니 다.익명 일 때 값 이 비어 있 습 니 다.
user_name
사용자 이름
user_email
사용자 메 일 박스
user_url
사용자 의 인터넷 주소.아주 오래된 형식 인 데,지금 은 거의 이것 을 쓰 라 고 요구 하지 않 는 다.)
comment
평론 의 내용 주체
submit_date
제출 일자
ip_address
사용자 ip
is_public
True 는 페이지 에 표 시 됩 니 다.
False,페이지 에 표시 되 지 않 습 니 다.
is_removed
트 루,댓 글 이 삭제 되면.간단하게 삭제 하 는 것 이 아니 라 삭 제 된 댓 글 을 추적 하 는 데 사용 된다.
(예 를 들 어 어떤 사람 은 언론 이 적합 하지 않 아서 관리 자 는 그것 을 제거 할 수 있 지만 원래 위치 에 알림 메 시 지 를 남 길 수 있다.)
원본 코드:
from __future__ import unicode_literals
from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.contrib.sites.models import Site
from django.db import models
from django.utils import timezone
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
try:
from django.urls import reverse
except ImportError:
from django.core.urlresolvers import reverse # Django < 1.10
from .managers import CommentManager
COMMENT_MAX_LENGTH = getattr(settings, 'COMMENT_MAX_LENGTH', 3000)
class BaseCommentAbstractModel(models.Model):
"""
An abstract base class that any custom comment models probably should
subclass.
"""
# Content-object field
content_type = models.ForeignKey(ContentType,
verbose_name=_('content type'),
related_name="content_type_set_for_%(class)s",
on_delete=models.CASCADE)
object_pk = models.TextField(_('object ID'))
content_object = GenericForeignKey(ct_field="content_type", fk_field="object_pk")
# Metadata about the comment
site = models.ForeignKey(Site, on_delete=models.CASCADE)
class Meta:
abstract = True
def get_content_object_url(self):
"""
Get a URL suitable for redirecting to the content object.
"""
return reverse(
"comments-url-redirect",
args=(self.content_type_id, self.object_pk)
)
@python_2_unicode_compatible
class CommentAbstractModel(BaseCommentAbstractModel):
"""
A user comment about some object.
"""
# Who posted this comment? If ``user`` is set then it was an authenticated
# user; otherwise at least user_name should have been set and the comment
# was posted by a non-authenticated user.
user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=_('user'),
blank=True, null=True, related_name="%(class)s_comments",
on_delete=models.SET_NULL)
user_name = models.CharField(_("user's name"), max_length=50, blank=True)
# Explicit `max_length` to apply both to Django 1.7 and 1.8+.
user_email = models.EmailField(_("user's email address"), max_length=254,
blank=True)
user_url = models.URLField(_("user's URL"), blank=True)
comment = models.TextField(_('comment'), max_length=COMMENT_MAX_LENGTH)
# Metadata about the comment
submit_date = models.DateTimeField(_('date/time submitted'), default=None, db_index=True)
ip_address = models.GenericIPAddressField(_('IP address'), unpack_ipv4=True, blank=True, null=True)
is_public = models.BooleanField(_('is public'), default=True,
help_text=_('Uncheck this box to make the comment effectively '
'disappear from the site.'))
is_removed = models.BooleanField(_('is removed'), default=False,
help_text=_('Check this box if the comment is inappropriate. '
'A "This comment has been removed" message will '
'be displayed instead.'))
# Manager
objects = CommentManager()
class Meta:
abstract = True
ordering = ('submit_date',)
permissions = [("can_moderate", "Can moderate comments")]
verbose_name = _('comment')
verbose_name_plural = _('comments')
def __str__(self):
return "%s: %s..." % (self.name, self.comment[:50])
def save(self, *args, **kwargs):
if self.submit_date is None:
self.submit_date = timezone.now()
super(CommentAbstractModel, self).save(*args, **kwargs)
#
3.사용자 정의 댓 글 프레임 워 크분명히 이 플러그 인 은 아직 강하 지 않 고 기능 이 풍부 하지 않 으 며 인터페이스 가 아름 답지 않다.전체 프레임 워 크 를 사용자 정의 해 야 합 니 다!그럼 어 떡 하지?
만약 당신 이 django-contrib-commests 를 바탕 으로 두 번 째 로 my 라 는 이름 을 개발 했다 면comment_app 의 댓 글 프레임 워 크.이렇게 설정 하 십시오:
INSTALLED_APPS = [
...
'my_comment_app',
...
]
COMMENTS_APP = 'my_comment_app'
mycomment_app 의init__.py 에서 새로운 모델 등급 의 동작 이나 행동 을 정의 합 니 다.간단 한 예
예 를 들 어 어떤 사 이 트 는 사용자 가 댓 글 을 달 때 제목 title 을 제공 하 기 를 원한 다.기 존 플러그 인 에 있 는 model 에 이 필드 가 없 는 것 이 분명 합 니 다.사용자 정의 가 필요 합 니 다.어떻게?세 단계 로 나 누 기:
1.사용자 정의 comment 모델 을 만 들 고 title 필드 를 추가 합 니 다.
2.사용자 정의 comment form 모델 을 만 들 고 title 필드 를 추가 합 니 다.
3.사용자 정의 commentapp,새로운 방법 을 정의 하고 Django 에 게 알 립 니 다.
다음 패키지 만 들 기:
my_comment_app/
__init__.py
models.py
forms.py
models.py 파일 에 Comment With Title 모델 클래스 를 만 듭 니 다:
from django.db import models
from django_comments.abstracts import CommentAbstractModel
class CommentWithTitle(CommentAbstractModel):
title = models.CharField(max_length=300)
그리고 forms.py 파일 에 새로운 form 클래스 를 작성 하고 CommentForm.get 을 다시 씁 니 다.comment_create_data()방법,title 필드 를 추가 하 는 데 도움 을 줍 니 다.
from django import forms
from django_comments.forms import CommentForm
from my_comment_app.models import CommentWithTitle
class CommentFormWithTitle(CommentForm):
title = forms.CharField(max_length=300)
def get_comment_create_data(self):
# title
data = super(CommentFormWithTitle, self).get_comment_create_data()
data['title'] = self.cleaned_data['title']
return data
주:djangocomments.forms 에서'helper'클래스 를 제공 하여 사용자 정의 에 더욱 편리 하도록 도 와 줍 니 다.마지막 으로 mycomment_app/init.py 에서 작성 하 는 방법 은 Django 에 게 변경 사항 을 알려 줍 니 다.
def get_model():
from my_comment_app.models import CommentWithTitle
return CommentWithTitle
def get_form():
from my_comment_app.forms import CommentFormWithTitle
return CommentFormWithTitle
메모:위의 import 문 구 는 함수 체 내부 에 두 어야 합 니 다.최신 버 전의 django 는 app 의 를 허용 하지 않 기 때 문 입 니 다.init__.py 의 상단 import 모듈.메모:모듈 을 순환 적 으로 가 져 오지 마 세 요.모듈 을 중복 도입 하지 마 세 요!
더 많은 사용자 정의 API
위의 예 는 일반적인 방법 입 니 다.만약 에 수 요 를 만족 시 키 지 못 한다 면 아래 api 를 사용 할 수 있 습 니 다.모든 사용자 정의 app 은 적어도 그 중의 하 나 를 정의 해 야 합 니 다.
django_comments.get_model()
사용자 정의 comment 클래스 를 되 돌려 줍 니 다.(위의 예 와 결합 하여 이해 하 세 요.)
django_comments.get_form()
사용자 정의 comment form 클래스 를 되 돌려 줍 니 다.동상
django_comments.get_form_target()
form 이 post 에 있 을 때 제출 한 url 주 소 를 되 돌려 줍 니 다.
django_comments.get_flag_url()
"flag this comment"보기 의 URL 되 돌리 기
기본적으로 djangocomments.views.moderation.flag()
django_comments.get_delete_url()
"delete this comment"보기 의 URL 되 돌리 기
기본적으로 djangocomments.views.moderation.delete()
django_comments.get_approve_url()
"approve this comment from moderation"보기 의 URL 을 되 돌려 줍 니 다.
기본적으로 djangocomments.views.moderation.approve()
요약:Django Comment 댓 글 플러그 인 은 원래 의 화면 이 추 하지만 맞 춤 형 제작 을 통 해 아름 답 고 적용 되 는 댓 글 시스템 을 바 꿀 수 있 습 니 다.예 를 들 어 블 로 거 개인 홈 페이지 의 댓 글 시스템!
Django contrib Comments 댓 글 모듈(상세 설명)을 기반 으로 한 이 편 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 가 되 고 많은 응원 부 탁 드 리 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.