Django Kommentare: Wollen Sie Benutzer-URL entfernen, nicht das Modell erweitern. Wie man?
-
12-09-2019 - |
Frage
verstehe ich völlig in die Dokumentation auf die Kommentare App in Django erweitert, und möchte wirklich mit der automatischen Funktionalität halten und ...
In der aktuellen App, ich habe absolut keine Verwendung für eine „URL“ zusammen mit einem Kommentar eingereicht werden.
Das minimalinvasive der Standardeinstellung, wie kann ich dieses Feld verhindern, zeigt mit dem Kommentar-Formular oben
Mit Django 1 oder Stamm, und so viele generic / Einbauten wie möglich (allgemeine Ansichten, Standard Kommentare einrichten, usw. Ich habe nur ein einziger allgemeine Ansicht Wrapper bisher).
Lösung
Das ist gut dokumentiert, unter Customizing der Kommentare Rahmen .
Alle Ihre App verwenden ist get_form
, eine Unterklasse der CommentForm
mit dem URL-Feld knallte zurück. So etwas wie:
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')
Andere Tipps
kann ich nicht auf SmileyChris Kommentar post aus irgendeinem Grund, so werde ich es hier posten. Aber, lief ich Fehler in nur Antwort SmileyChris verwenden. Sie müssen auch die get_comment_create_data Funktion überschreiben, weil Kommentarformular für die Pfosten Schlüssel aussehen wird, die Sie entfernt. Also hier ist mein Code, nachdem ich drei Felder entfernt.
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')
Dies ist die Funktion, die Sie überschreiben
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,
)
Meine quick and dirty Lösung: Ich habe die die ‚email‘ und ‚url‘ Felder versteckte Felder, mit einem beliebigen Wert loszuwerden ‚dieses Feld ist erforderlich‘ Fehler
.Es ist nicht elegant, aber es ist schnell und ich muss Kommentarformular nicht Unterklasse. Alle Arbeiten von Hinzufügen von Kommentaren in der Vorlage gemacht, das ist schön. Es sieht aus wie dieser (Achtung: nicht getestet, da es sich um eine vereinfachte Version meiner eigentlichen Code ist):
{% 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>