Personalizando django-comments
-
16-09-2019 - |
Pergunta
Então, eu estou usando django.contrib.comments. Eu instalei-o OK, mas em vez do formulário de comentário padrão pesado, eu gostaria de usar um modelo de formulário personalizado que só mostra uma textarea e botão enviar.
A lógica por trás disso é que o usuário só vê a forma, se a área já autenticado, e eu gostaria a manter a forma simples e pegar o seu nome de usuário etc automaticamente.
Eu tenho implementado um formulário personalizado, mas estou recebendo um erro ao tentar apresentá-lo.
Aqui está o que eu tenho no meu modelo para a página com o formulário de comentário (entrada é o objeto passado do ponto de vista):
{% load comments %}
{% render_comment_form for entry %}
E aqui está o meu HTML no /templates/comments/form.html:
{% if user.is_authenticated %}
<p>Submit a comment:</p>
<form action="/comments/post/" method="post">
<textarea name="comment" id="id_comment" rows="2" style="width: 90%;"></textarea>
<input type="hidden" name="options" value="{{ options }}" />
<input type="hidden" name="target" value="{{ target }}" />
<input type="hidden" name="gonzo" value="{{ hash }}" />
<input type="hidden" name="next" value="{{ entry.get_absolute_url }}" />
<span style="float:right;"><input type="submit" name="post" value="Add"></span>
</form>
{% else %}
<p>Please <a href="/login/">log in</a> to post a comment.</p>
{% endif %}
Ela torna tudo bem inicialmente, mas quando eu tento enviar o formulário de comentário, eu recebo o seguinte erro Django:
Comment post not allowed (400)
Why: Missing content_type or object_pk field.
alguém pode ajudar?
Solução 2
Corrigido o problema copiando a partir app Theju - em particular, ver comentário Josué Works' on part 2
.Outras dicas
O modelo de comentário utiliza uma chave estrangeira genérico para mapear o objeto para o qual o comentário foi feito como uma entrada de blog. Estes são necessários campos ocultos incluídos no formulário de comentário padrão.
De django.contrib.comments.models
...
class CommentSecurityForm(forms.Form):
"""
Handles the security aspects (anti-spoofing) for comment forms.
"""
content_type = forms.CharField(widget=forms.HiddenInput)
object_pk = forms.CharField(widget=forms.HiddenInput)
...
Se você não alterou a classe de formulário e só quer mudar o modelo de html, então você pode incluir esses campos adicionando um loop sobre todos os campos ocultos.
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}