Найти - Пользователи
Полная версия: Что правильнее, передача информации через контекст, или написание шаблонного тега?
Начало » Django » Что правильнее, передача информации через контекст, или написание шаблонного тега?
1
S
Хотим мы, допустим, вывести список комментариев для модерации и чтобы была там ссылка “удалить” и “одобрить”. Предположим, ссылки получаем функциями get_delete_url и get_approve_url.
def comments_moderation(request):
    comments = CommentWithTitle.objects.filter(is_public=False)
    for comment in comments:
        del_url = get_delete_url(comment)
        print del_url
    return render_to_response('newcomments.html', {'comments': comments}, context_instance=RequestContext(request))
Как правильнее получить их в шаблоне? В представлении через цикл поместить в контекст, или сделать собственный шаблонный тег?
svas
Я думаю лучше сделать функции get_*_url методами модели
FishHook
Правильнее IMHO заюзать CBV и написать миксин ModeratorMixin, помещая который в перечень классов-родителей будем получать определенный функционал.
S
svas
Я думаю лучше сделать функции get_*_url методами модели
Не совсем понимаю, что делать с тем, что вернёт метод.
Вот получили мы не опубликованные комментарии:
comments = CommentWithTitle.objects.filter(is_public=False)
и куда пихать ссылки?

FishHook
Правильнее IMHO заюзать CBV и написать миксин ModeratorMixin, помещая который в перечень классов-родителей будем получать определенный функционал.
Попробую так.
S
Написал пока так:
view.py
def delete_comment(request, comment_id):
    comment = CommentWithTitle.objects.get(id = comment_id)
    return HttpResponseRedirect(get_delete_url(comment))

urls.py
url(r'delete_comment/(?P<comment_id>\d+)/$', delete_comment, name='delete_comment'),

шаблон
<a href={% url delete_comment comment.pk %}>Удалить комментарий</a>

Работает, но кажется каким-то не шибко изящным вариантом. Или нормально? Сейчас ещё попробую с CBV сделать, посмотрю, как красивее.
inoks
Вот получили мы не опубликованные комментарии:
comments = CommentWithTitle.objects.filter(is_public=False)

В модели CommentWithTitle есть:

@models.permalink
def get_delete_url(self):
    return ('delete_comment', (), {
        	'comment_id': self.pk,
        	})

В template:

{% for comment in comments %}
{{comment }}
<a href="{{ comment.get_delete_url  }}">Удалить комментарий</a>
{% endfor %}
S
inoks, спасибо, вариант хороший.
В итоге получается, что по ссылке с адресом
{{ comment.get_delete_url  }}
мы идём на представление, которое перенаправляет нас на представление:
return urlresolvers.reverse("django.contrib.comments.views.moderation.delete",
                                    args=(comment.id,))

Поэтому подумалось, почему бы get_delete_url не заставить возвращать сразу адрес на это представление:
@models.permalink
    def delete_comment_url(self):
        return 'comments-delete', (), {'comment_id': self.pk}
Где ‘comments-delete’ это имя шаблона url из приложения comments, ведущего на нужное представление “django.contrib.comments.views.moderation.delete”. Это же должно работать? Почему-то в шаблоне
{{ comment.delete_comment_url }}
ничего не выводит. При этом если имя шаблона сменить на ‘delete_comment’, то всё работает. Что не так может быть?
FishHook
ИМХО удалять информацию по ГЕТу это очень плохая практика.
S
FishHook
ИМХО удалять информацию по ГЕТу это очень плохая практика.
Насколько помню, это представление запрашивает подтверждение удаления, которое отправляется уже кнопкой, ПОСТом.
zheromo
S
Как правильнее получить их в шаблоне?
В 1.5 сам инстанс вьюхи попадает в контекст
Передавайте в контекст сам self вьюхи
У него вызывайте функции проперти и т. д.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB