2009-09-21 5 views
12

나는 완전히 장고에 댓글 응용 프로그램을 확장에 문서를 이해 해요, 정말 자동 기능 하지만 고수하고 싶습니다 ... 현재 응용 프로그램에서Django 댓글 : 모델을 확장하지 않고 사용자 URL을 제거하고 싶습니다. 어떻게?

, 나는 "는 절대적으로 아무 소용이 없다 URL "과 함께 제출되어야합니다.

기본 설정의 최소 침습 인, 는 어떻게 코멘트 양식에 나타나지에서이 필드를 방지 할 수 있습니다?

Django 1 또는 Trunk를 사용하고 가능한 한 많은 generic/built-in을 사용합니다 (일반보기, 기본 주석 설정 등. 지금까지는 하나의 일반보기 래퍼 만 있습니다.).

답변

9

이 내용은 customizing the comments framework에 대해 잘 설명되어 있습니다.

모든 응용 프로그램은 get_form을 사용하고 url 필드가 팝업 된 CommentForm의 하위 클래스를 반환합니다. 예 :

+7

문서가 훌륭하다고 나는 동의하지만 "base_fields"로가는 길을 찾고 사용하는 것으로 논해야합니다. pop()은 내가 쉽게 접하게 된 것이 아니었다. 예, 댓글 프레임 워크는 잘 문서화되어 있지만 "이"는 아닙니다. 나는 그런 일을하는 것이 내 책임이라는 데 동의하며, 나는 당신의 시간과 도움에 대해 대단히 감사합니다! 감사합니다 형! –

+0

이렇게하면 Django 1.4에서 오류가 발생합니다. killerbarney의 솔루션에서 언급 한 것처럼 get_comment_create_data 메서드를 재정의해야합니다. –

16

나는 어떤 이유로 SmileyChris의 게시물에 댓글을 달 수 없으므로 여기에 게시하겠습니다. 그러나 SmileyChris의 응답을 사용하여 오류가 발생했습니다. CommentForm은 제거한 포스트 키를 찾기 때문에 get_comment_create_data 함수를 덮어 써야한다. 그래서 여기에 세 개의 필드를 제거한 후 코드가 있습니다.

class SlimCommentForm(CommentForm): 
""" 
A comment form which matches the default djanago.contrib.comments one, but with 3 removed fields 
""" 
def get_comment_create_data(self): 
    # Use the data of the superclass, and remove extra fields 
    return dict(
     content_type = ContentType.objects.get_for_model(self.target_object), 
     object_pk = force_unicode(self.target_object._get_pk_val()), 
     comment  = self.cleaned_data["comment"], 
     submit_date = datetime.datetime.now(), 
     site_id  = settings.SITE_ID, 
     is_public = True, 
     is_removed = False, 
    ) 


SlimCommentForm.base_fields.pop('url') 
SlimCommentForm.base_fields.pop('email') 
SlimCommentForm.base_fields.pop('name') 

def get_comment_create_data(self): 
    """ 
    Returns the dict of data to be used to create a comment. Subclasses in 
    custom comment apps that override get_comment_model can override this 
    method to add extra fields onto a custom comment model. 
    """ 
    return dict(
     content_type = ContentType.objects.get_for_model(self.target_object), 
     object_pk = force_unicode(self.target_object._get_pk_val()), 
     user_name = self.cleaned_data["name"], 
     user_email = self.cleaned_data["email"], 
     user_url  = self.cleaned_data["url"], 
     comment  = self.cleaned_data["comment"], 
     submit_date = datetime.datetime.now(), 
     site_id  = settings.SITE_ID, 
     is_public = True, 
     is_removed = False, 
    ) 
+5

당신이 import 문이 필요합니다 : django.contrib.contenttypes.models이'장고 확장되는 의견 프레임 워크에 따라 django.conf 가져 오기 설정 수입 날짜 – PhoebeB

+0

에서 수입 force_unicode 을 django.utils.encoding에서 ContentType이 가져올에서. contrib.comments' 또는'django_comments' (나는 후자를 더 수집합니다),'django_comments.forms에서 가져 오기 CommentForm' – jozxyqk

5

내 신속하고 더러운 솔루션을 덮어 쓰는 기능입니다 : 내가 없애 임의의 값으로 '이메일'과 'URL'필드 숨겨진 필드를 만든 '이 입력란은 필수입니다.'오류가 발생했습니다.

우아한 것은 아니지만 빠르며 CommentForm을 하위 클래스로 분류하지 않아도됩니다. 덧글을 추가하는 모든 작업이 템플릿에서 완료되었습니다. 다음과 같이 표시됩니다 (경고 : 실제 코드의 단순화 된 버전이기 때문에 테스트를 거치지 않았습니다.) :

{% get_comment_form for entry as form %} 

<form action="{% comment_form_target %}" method="post"> {% csrf_token %} 

{% for field in form %} 

    {% if field.name != 'email' and field.name != 'url' %} 
     <p> {{field.label}} {{field}} </p> 
    {% endif %} 

{% endfor %} 

    <input type="hidden" name="email" value="[email protected]" /> 
    <input type="hidden" name="url" value="http://www.foofoo.com" /> 

    <input type="hidden" name="next" value='{{BASE_URL}}thanks_for_your_comment/' /> 
    <input type="submit" name="post" class="submit-post" value="Post"> 
</form> 
관련 문제