Django Commenti: desidera rimuovere URL utente, non ampliare il modello. Come?
-
12-09-2019 - |
Domanda
Sono totalmente la comprensione della documentazione sull'espansione della Commenti applicazione in Django, e piacerebbe davvero restare con la funzionalità automatica di ma ...
In applicazione corrente, non ho assolutamente alcuna utilità per un "URL" da presentare insieme a un commento.
Essere minimamente invasiva di configurazione di default, come posso evitare che questo campo da presentarsi con il modulo di commento
Utilizzando Django 1, o del tronco, e come molti / built-in generico possibile (vista generici, i commenti di default impostati, ecc ho solo un unico punto di vista generico involucro finora).
Soluzione
Questo è ben documentato sotto personalizzazione del quadro commenti .
Tutta la vostra applicazione utilizzerà è get_form
, restituendo una sottoclasse della CommentForm
con il campo URL spuntato. Qualcosa di simile:
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')
Altri suggerimenti
Non posso commentare sul posto SmileyChris' per qualche ragione, in modo da sto andando a postare qui. Ma, mi sono imbattuto in errori che utilizzano solo la risposta SmileyChris'. È inoltre necessario sovrascrivere la funzione get_comment_create_data perché CommentForm è andare a cercare quelle chiavi sul post che è stato rimosso. Quindi, ecco il mio codice dopo ho rimosso tre campi.
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')
Questa è la funzione che si sta sovrascrivendo
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 mia soluzione rapida e sporca: ho fatto il la 'e-mail' e campi 'URL' campi nascosti, con un valore arbitrario di sbarazzarsi di errori 'Questo campo è obbligatorio'
.Non è elegante, ma è veloce e non ho dovuto sottoclasse CommentForm. Tutto il lavoro di aggiungere commenti è stato fatto nel modello, che è bello. Ecco come si presenta (attenzione: non testato, in quanto si tratta di una versione semplificata del mio codice vero e proprio):
{% 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>