Фильтрация блогов сообщений в Django на основе утвержденных администратором сообщений - PullRequest
1 голос
/ 24 апреля 2020

Я создал блог как проект, и я назначил пользователей отправлять сообщения для блога напрямую, но я хочу направить это сообщение сначала администратору для утверждения, прежде чем показывать на веб-сайте. Я добавил поле для публикации модели, 'admin_approved = models.BooleanField (default = False)'. Я также отфильтровал по Post.objects.filter (admin_approved = True), но все равно ничего не происходит, и публикации публикуются

class PostListView(ListView):
    model = Post
    template_name = "score.html"
    ordering = ['-date_posted']
    context_object_name = 'posts'


def score(request):
    context = {
        'posts': Post.objects.filter(admin_approved=True)
    }
    return render(request, "score.html", context)


class PostDetailView(DetailView):
    model = Post
    template_name = "post_detail.html"


class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['caption', 'design']
    template_name = "post_form.html"
    success_url = '/score'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

Вот модель:

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    design = models.ImageField(
        blank=False, null=True, upload_to='new designs')
    caption = models.TextField(max_length=100)
    date_posted = models.DateTimeField(default=timezone.now)
    admin_approved = models.BooleanField(default=False)

    def __str__(self):
        return self.caption

    def get_absolute_url(self):
        return reverse("core:post-detail", kwargs={"pk": self.pk})

вот URL :

from django.urls import include, path
from . import views
from .views import (HomeView, ItemDetailView, PostCreateView, PostDeleteView,
                    PostDetailView, PostListView, PostUpdateView, checkout)

app_name = 'core'

urlpatterns = [
    path('', HomeView.as_view(), name='home'),
    path('checkout/', checkout, name='checkout'),
    path('product/<slug>/', ItemDetailView.as_view(), name='product'),
    path('score/', PostListView.as_view(), name='score'),
    path('score/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
    path('score/new/', PostCreateView.as_view(), name='post-create'),
    path('score/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
    path('score/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),

]

Я пропускаю шаг или я должен что-то сделать?

1 Ответ

0 голосов
/ 24 апреля 2020

Вы никогда не фильтруете ListView:

class PostListView(ListView):
    model = Post
    template_name = "score.html"
    ordering = ['-date_posted']
    context_object_name = 'posts'


def score(request):
    context = {
        'posts': Post.objects.filter(admin_approved=True)
    }
    return render(request, "score.html", context)

Как видите, у вас есть представление под названием score(), которое не подключено к вашему urls.py. Когда вы go до 'score/', вызывается функция просмотра PostListView, но там вы указали только model = Post, поэтому по умолчанию Django возвращает вам все ваши объекты Post .

Вам необходимо добавить следующую строку в PostListView:

queryset = Post.objects.filter(admin_approved=True)

и, возможно, удалить представление score, так как оно ничего не делает, вероятно, вызывает всю эту путаницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...