Здравствуйте. Хочу сделать модерацию постов.
Нужно, чтобы админ мог модерировать посты, не заходя в админ панель Django.
Как вариант:
Для админа на странице "Список постов" отображать все посты - и опубликованные, и те, которые ещё на модерации (их с какой-то пометкой).
Для обычного юзера или гостя на этой же страницы видны только опубликованные посты.
Это необходимо для того, чтобы каждый админ не входил в панель администратора сайта, а мог модерировать посты со страницы сайта, на лету.
Например, админ видит на странице "Список постов" какой-то новый поступивший пост. Переходит на страницу детального просмотра данного поста - и там есть кнопочки "Опубликовать/Редактировать/Удалить".
Если юзер отредактировал свой старый пост, то перед публикацией отредактированной версии тоже нужно пройти модерацию
Следующий код демонстрирует реализацию модерации сообщений из админ-панели. Я просто не знаю, как сделать модерацию постов (созданных или обновленных) со страницы сайта (без входа в админ-панель).
models.py
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=50)
body = models.TextField()
moderation = models.BooleanField(default=False)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
forms.py
from .models import Post
class PostForm(forms.ModelForm):
title = forms.CharField(required=True)
body = forms.CharField(widget=forms.Textarea)
class Meta:
model = Post
fields = ['title', 'body']
views.py
from .forms import PostForm
class PostListView(generic.ListView):
model = Post
paginate_by = 10
def get_queryset(self):
queryset = super(PostListView, self).get_queryset()
return queryset.filter(moderation=True)
class PostCreateView(FormView):
form_class = PostForm
template_name = 'blog/post_form.html'
success_url = reverse_lazy('posts')
def form_valid(self, form):
response = super(PostCreateView, self).form_valid(form)
form.instance.user = self.request.user
form.save()
return response
class PostUpdateView(PermissionRequiredMixin, UpdateView):
model = Post
fields = ['title', 'body']
permission_required = 'blog.can_mark_returned'
admin.py
from .models import Post
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'user', 'moderation')
admin.site.register(Post, PostAdmin)
urls.py
urlpatterns = [
url(r'^posts/$', views.PostListView.as_view(), name='posts'),
url(r'^post/(?P<pk>\d+)$', views.PostDetailView.as_view(), name='post-detail'),
url(r'^post/create/$', views.PostCreateView.as_view(), name='post_create'),
url(r'^post/(?P<pk>\d+)/update/$', views.PostUpdateView.as_view(), name='post_update'),
]
post_list.html
{% extends "base_generic.html" %}
{% block title %}<title>Posts list</title>{% endblock %}
{% block content %}
<h1>All posts</h1>
{% if post_list %}
<ul>
{% for post in post_list %}
<li><a href="{{ post.get_absolute_url }}">{{ post.title }}</a> {{ post.user }}</li>
{% endfor %}
</ul>
{% else %}
<p>There are no posts.</p>
{% endif %}
{% endblock %}
post_form.html
{% extends "base_generic.html" %}
{% block content %}
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Submit" />
</form>
{% endblock %}