Django QuerySet пуст, пока я добавил кое-что - PullRequest
0 голосов
/ 06 июля 2018

Здравствуйте, я новичок в Django, и я решил сделать страницу блога. Проблема в том, что мой набор запросов пуст после того, как я создал новое приложение. есть идеи почему?

Пробовал с активным и без активного.

views.py

from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView

from django.http import Http404


from .models import BlogPost


class BlogPostListView(ListView):
    queryset = BlogPost.objects.all().active()
    template_name = "blog.html"

    def get_queryset(self, *args, **kwargs):
        request = self.request
        return BlogPost.objects.all().active()


def BlogPost_list_view(request):
    queryset = BlogPost.objects.all().active()
    context = {
        'object_blog': queryset
    }
    return render(request, "blog.html", context)

models.py

import random
import os

from django.db import models
from django.db.models.signals import pre_save, post_save
from django.urls import reverse

def get_filename_ext(filepath):
    base_name = os.path.basename(filepath)
    name, ext = os.path.splitext(base_name)
    return name, ext


def upload_image_path(instance, filename):
    print(instance)
    print(filename)
    new_filename = random.randint(1,18341264712)
    name, ext = get_filename_ext(filename)
    final_filename = '{new_filename}{ext}'.format(new_filename= new_filename, ext=ext)
    return "products/{new_filename}/{final_filename}".format(
        new_filename= new_filename,
        final_filename=final_filename
    )


class BlogPostQuerySet(models.query.QuerySet):
    def active(self):
        return self.filter(active=True)

    def featured(self):
        return self.filter(featured=True, active=True)


class BlogPostManager(models.Manager):
    def get_queryset(self):
        return BlogPostQuerySet(self.model, using=self._db)

    def all(self):
        return self.get_queryset()


class BlogPost(models.Model):
    title = models.CharField(max_length=120)
    slug = models.SlugField(blank=True, unique=True)
    description = models.TextField()
    image = models.ImageField(upload_to=upload_image_path, null=True, blank=True)
    timestamp = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=True)

    objects = BlogPostManager()

    def get_absolute_url(self):
        return "{slug}/".format(slug=self.slug)

        # return reverse("products:detail", kwargs={"slug": self.slug})

    def __str__(self):
        return self.title

    def __unicode__(self):
        return self.title

urls.py

from django.conf import settings
from django.conf.urls import url, include
from django.conf.urls.static import static

from .views import BlogPostListView, BlogPostDetailSlugView



urlpatterns = [
    url(r'^$', BlogPostListView.as_view(), name='list'),
    url(r'^(?P<slug>[-\w]+)/$', BlogPostDetailSlugView.as_view(), name='detail'),
]

if settings.DEBUG:
    urlpatterns = urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

admin.py

from django.contrib import admin
from .models import BlogPost


class BlogPostAdmin(admin.ModelAdmin):
    list_display = ['__str__', 'slug']

    class Meta:
        model = BlogPost


admin.site.register(BlogPost, BlogPostAdmin)

blog.html

{% for obj in object_blog %}

          <!-- Blog Post -->
          <div class="card mb-4 text-white bg-dark">
            {% if obj.image %}
            <!-- {{MEDIA_URL}} -->
            <img class="card-img-top" src="{{ obj.image.url }}" alt="Card image cap">
            {% else %}
            <h1> No pic </h1>
            {% endif %}
            <div class="card-body">
              <h2 class="card-title">{{ obj.title }}</h2>
              <p class="card-text">{{ obj.description|slice:":255" }} ...</p>
              <a href="#" class="btn btn-primary">Read More &rarr;</a>
            </div>
            <div class="card-footer text-muted">
              {{ obj.timestamp }}
              <a href="#">Start Bootstrap</a>
            </div>
          </div>

          {% endfor %}

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

1 Ответ

0 голосов
/ 06 июля 2018

Ваши два представления BlogPostListView и BlogPost_list_view делают почти одно и то же, я не знаю, почему у вас их два. Но обратите внимание, что первым является тот, который фактически используется вашим URL.

Теперь это представление на основе классов, которое отправит переменную с именем blog_list или object_list в шаблон. Однако сам шаблон перебирает переменную с именем object_blog, которая будет отправлена ​​(неиспользованным) вторым представлением. Вы должны изменить это на object_list - или, по мнению, вы можете добавить context_object_name = 'object_blog' (но я не рекомендую это).

...