Django Комментарии: хотите удалить URL-адрес пользователя, а не расширять модель. Как?
Я полностью понимаю документацию по расширению приложения комментариев в Django и действительно хочу придерживаться автоматической функциональности, но...
В текущем приложении я абсолютно бесполезен для отправки "URL" вместе с комментарием.
Будучи минимально инвазивным по умолчанию, как я могу предотвратить появление этого поля в форме комментария?
Использование Django 1 или Trunk, а также как можно больше общих/встроенных функций (общие представления, настройки по умолчанию и т.д. На данный момент у меня есть только одна общая оболочка представления).
Ответы
Ответ 1
Это хорошо описано в разделе настройка структуры комментариев.
Все ваше приложение будет использовать get_form
, возвращая подкласс CommentForm
с полем URL-адреса. Что-то вроде:
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')
Ответ 2
По какой-то причине я не могу комментировать почту SmileyChris, поэтому я собираюсь опубликовать ее здесь. Но я столкнулся с ошибками, используя только ответ SmileyChris. Вы также должны перезаписать функцию get_comment_create_data, потому что CommentForm будет искать эти удаленные ключи. Итак, вот мой код после того, как я удалил три поля.
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,
)
Ответ 3
Мое быстрое и грязное решение: я создал скрытые поля полей "email" и "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>