Django Комментарии: хотите удалить пользовательский URL, а не расширять модель. Как? - PullRequest
13 голосов
/ 21 сентября 2009

Я полностью разбираюсь в документации по расширению приложения Comments в Django, и очень хотел бы придерживаться автоматической функциональности , но ...

В текущем приложении я абсолютно не использую URL-адрес для отправки вместе с комментарием.

Будучи минимально инвазивным по умолчанию, как я могу предотвратить появление этого поля в форме комментария ?

Использование Django 1 или Trunk, и как можно больше универсальных / встроенных модулей (универсальные представления, настройка комментариев по умолчанию и т. Д. У меня пока только одна универсальная оболочка представления)

Ответы [ 3 ]

17 голосов
/ 22 января 2011

По какой-то причине я не могу комментировать пост SmileyChris, поэтому я опубликую его здесь. Но я столкнулся с ошибками, используя только ответ SmileyChris. Вы также должны перезаписать функцию get_comment_create_data, потому что CommentForm будет искать те ключи Post, которые вы удалили. Итак, вот мой код после того, как я удалил три поля.

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,
    )
10 голосов
/ 22 сентября 2009

Это хорошо задокументировано в разделе Настройка структуры комментариев .

Все ваше приложение будет использовать 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')
5 голосов
/ 04 апреля 2011

Мое быстрое и грязное решение: я сделал скрытые поля для полей '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="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>
...