使用order.by('?').first()来解决Django中的随机内容问题

And*_*yen 1 python django

更新#4:

  • for循环slider.html当前没有在上次更新后提取内容.Slider.html是随机的; 但是,我有四个相同的故事,网址不再适用于他们相应的详细视图页面了.
  • List.html已修复,现在是随机的.

slider.html - 此部分仍然不稳定,(更新 - 下午4:19)

{% for random_article in random_articles %}
        <div class="slider">
            <div class="group visible">
                <div class="sliderItem">
                    <a href="{%url "detailed" slug=random_article.slug %}"><img src="{{random_article.relatedImage}}" alt="" class="sliderPicture"></a>
                    <a href="{%url "detailed" slug=random_article.slug %}"><p class="related">{{random_article.title}}</p></a>
                </div><!-- /.sliderItem -->
            </div><!-- /.group -->
    </div><!-- /.slider -->
        {% endfor %}
Run Code Online (Sandbox Code Playgroud)

单击详细视图时出现URL错误:

NoReverseMatch at /last-us
Reverse for 'detailed' with arguments '()' and keyword arguments '{u'slug': ''}' not found. 1 pattern(s) tried: ['(?P<slug>\\S+)']
Run Code Online (Sandbox Code Playgroud)

新的罪魁祸首(为什么slider.html不工作)

urls.py

from django.conf.urls import patterns, url
from . import views

urlpatterns = patterns(
    '',
    url(r'^$', views.BlogIndex.as_view(), name="list"),
    url(r'^(?P<slug>\S+)', views.BlogDetail.as_view(), name="detailed"),
)
Run Code Online (Sandbox Code Playgroud)

views.py(更新时间:下午4:19)

添加context['random_slider'] = FullArticle.objects.order_by('?')[:4]但我不认为这是正确的方法.因此,我可以获得四篇不同的文章,而相同的文章中有四篇是随机的.

from django.views import generic
from . import models 
from .models import FullArticle

# Create your views here.
class BlogIndex(generic.ListView):
    queryset = models.FullArticle.objects.published()
    template_name = "list.html" 

    def get_context_data(self, **kwargs):
        context = super(BlogIndex, self).get_context_data(**kwargs)
        context['random_article'] = FullArticle.objects.order_by('?').first()
        return context

class BlogDetail(generic.DetailView):
    model = models.FullArticle
    template_name = "detailed.html"

    def get_context_data(self, **kwargs):
        context = super(BlogDetail, self).get_context_data(**kwargs)
        context['object_list'] = models.FullArticle.objects.published()
        return context

    def get_context_data(self, **kwargs):
        context = super(BlogDetail, self).get_context_data(**kwargs)
        context['random_articles'] = FullArticle.objects.exclude(
            pk=self.get_object().pk
            ).order_by('?')[:4]
        return context
Run Code Online (Sandbox Code Playgroud)

原始问题

我正在使用FullArticle.objects.order_by('?').first()从我的数据库中获取一篇随机文章,但是当我刷新页面时它正在给出相同的文章.我的模型,视图或我如何调用它(使用切片)list.htmlslider.html导致问题的方式可能缺少某些东西.

我想在页面加载时随机制作这两部分:

list.html(已更改为{{random_article.}}) - 问题的这一部分已修复.

<div class="mainContent clearfix">
        <div class="wrapper">
            <h1>Top 10 Video Games</h1>
            {% for article in object_list|slice:":1" %}
            <p class="date">{{article.pubDate|date:"l, F j, Y" }}</p> | <p class="author">{{article.author}}</p>
            <a href="{%url "detailed" slug=article.slug %}"><img src="{{article.heroImage}}" alt="" class="mediumImage"></a>
            <p class="caption">{{article.body|truncatewords:"80"}}</p>
            {% endfor %}
Run Code Online (Sandbox Code Playgroud)

models.py

from django.db import models
from django.core.urlresolvers import reverse

# Create your models here.
class FullArticleQuerySet(models.QuerySet):
    def published(self):
        return self.filter(publish=True)

class FullArticle(models.Model):
    title = models.CharField(max_length=150)
    author = models.CharField(max_length=150)
    slug = models.SlugField(max_length=200, unique=True)
    pubDate = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    category = models.CharField(max_length=150)
    heroImage = models.CharField(max_length=250, blank=True)
    relatedImage =  models.CharField(max_length=250, blank=True)
    body =  models.TextField()
    publish = models.BooleanField(default=True)
    gameRank = models.CharField(max_length=150, blank=True, null=True)

    objects = FullArticleQuerySet.as_manager()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("FullArticle_detailed", kwargs={"slug": self.slug})

    class Meta:
        verbose_name = "Blog entry"
        verbose_name_plural = "Blog Entries"
        ordering = ["-pubDate"]
Run Code Online (Sandbox Code Playgroud)

Pau*_*ine 5

问题是您在"编译时"设置了类属性的值,而不是每次调用视图时都是如此.相反,你可以这样做:

class BlogIndex(generic.ListView):
    queryset = models.FullArticle.objects.published()
    template_name = "list.html" 

    def random_article(self):
        return = FullArticle.objects.order_by('?').first()
Run Code Online (Sandbox Code Playgroud)

要么:

class BlogIndex(generic.ListView):
    queryset = models.FullArticle.objects.published()
    template_name = "list.html" 

    def get_context_data(self, **kwargs):
        context = super(BlogIndex, self).get_context_data(**kwargs)
        context['random_article'] = FullArticle.objects.order_by('?').first()
        return context
Run Code Online (Sandbox Code Playgroud)

[更新]

在列表html中,我只需要一篇随机文章.在slider.html中,我需要四篇随机文章,我会在defArt_context_data片段中的某个地方使用FullArticle.objects.order_by('?')[:4]吗?

是.在视图中将其复数(不要忘记从侧面列表中排除主要文章):

class BlogDetail(generic.DetailView):
    model = models.FullArticle
    template_name = "detailed.html"

    def get_context_data(self, **kwargs):
        context = super(BlogDetail, self).get_context_data(**kwargs)
        context['random_articles'] = FullArticle.objects.exclude(
                                          pk=self.get_object().pk
                                     ).order_by('?')[:4]
        return context
Run Code Online (Sandbox Code Playgroud)

在模板中,执行:

{% for random_article in random_articles %}
    <div class="sliderItem">
                <a href="{%url "detailed" slug=random_article.slug %}"><img src="{{random_article.relatedImage}}" alt="" class="sliderPicture"></a>
                <a href="{%url "detailed" slug=random_article.slug %}"><p class="related">{{random_article.title}}</p></a>
    </div><!-- /.sliderItem -->
{% endfor %}
Run Code Online (Sandbox Code Playgroud)