Django Commentaires: Vous voulez supprimer l'URL de l'utilisateur, pas étendre le modèle. Comment?

StackOverflow https://stackoverflow.com/questions/1456267

Question

Je suis tout à fait comprendre la documentation sur l'élargissement de l'application des commentaires dans Django, et voudrais vraiment coller avec la fonctionnalité automatique et ...

Dans l'application actuelle, je n'ai absolument aucune utilité pour une « URL » à être accompagné d'un commentaire.

être mini-invasive de la configuration par défaut, Comment puis-je empêcher ce champ d'apparaître avec le formulaire de commentaire

Utilisation de Django 1, ou le tronc, et autant de génériques / Encastrements possible (vues génériques, commentaires par défaut mis en place, etc. je n'ai qu'une seule enveloppe de vue générique jusqu'à présent).

Était-ce utile?

La solution

Ceci est bien documenté sous personnalisation le cadre des commentaires .

Toutes votre application utilisera est get_form, retournant une sous-classe de la CommentForm avec le champ URL éclaté. Quelque chose comme:

class NoURLCommentForm(CommentForm):
    """
    A comment form which matches the default djanago.contrib.comments one, but
    doesn't have a URL field.

    """
NoURLCommentForm.base_fields.pop('url')

Autres conseils

Je ne peux pas commenter sur le poste de SmileyChris pour une raison quelconque, je vais poster ici. Mais, je suis tombé sur des erreurs en utilisant simplement la réponse SmileyChris. Vous devez également remplacer la fonction get_comment_create_data car CommentForm va chercher les clés de poste que vous avez supprimés. Alors, voici mon code après avoir enlevé trois champs.

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')

Ceci est la fonction que vous écrasez

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,
    )

La solution rapide et sale: Je fait les champs du « email » et « url » champs cachés, avec une valeur arbitraire pour se débarrasser des erreurs « Ce champ est obligatoire »

.

Il est pas élégant, mais il est rapide et je ne pas sous-classe CommentForm. Tous les travaux d'ajout de commentaires a été fait dans le modèle, ce qui est agréable. Il ressemble à ceci (avertissement: non testé, car il est une version simplifiée de mon code réel):

{% 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="foo@foo.foo" />
    <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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top