从帖子中检索元数据,然后按Django中的所述元数据对帖子进行排序

时间:2018-11-17 12:32:12

标签: python django

我的博客应用程序中有两个相互关联的模型;类别和职位。博客首页显示了帖子列表及其相应的元数据,就像应该的那样;相当标准的东西。

除了在首页上显示帖子外,它们还以简短形式(仅是类别和标题)显示在个人用户的个人资料页面上。

我感兴趣的是对属于某个类别的所有帖子进行排序,但是我设法使其起作用的唯一方法是:

新闻 一些头衔 新闻 另一个标题 蟒蛇 另一个任意标题 新闻 另一个标题

我想对它进行排序:

新闻 一些头衔 另一个标题 又一个标题 蟒蛇 另一个任意标题

A,当我尝试提出一种方法时,我的脑子一直变成一碗意大利面,所以事不宜迟。我应该怎么做呢? 我认为从帖子的元数据中调用类别只是为了尝试通过检索到的数据对帖子进行分类还有些不足,但是除此之外,我还是有些迷茫。

这是来自user_profile.html的模板代码段:

{% if user.post_set.exists %}
  <p>
    {% for post in user.post_set.all|dictsortreversed:"date_posted" %}
      <span style="margin-right: 5px; padding: 3px 6px; border-radius:12px; color:#FFF; background-color:#FFA826;">{{ post.category }}</span><br/>
      <a style="margin-left:3px;" href="{% url 'blog:post-detail' post.slug %}">{{ post.title|truncatechars_html:30 }}</a><br/>
    {% endfor %}
  </p>
{% endif %}

模型:

class Category(models.Model):
    class Meta:
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name


class Post(models.Model):
    author      = models.ForeignKey(User, on_delete=models.CASCADE)
    title       = models.CharField(max_length=60)
    category    = models.ForeignKey(Category, blank=True, null=True, on_delete=models.CASCADE)
    content     = RichTextUploadingField(
                                    external_plugin_resources=[(
                                        'youtube',
                                        '/static/ckeditor/ckeditor/plugins/youtube/',
                                        'plugin.js'
                                        )],
                                        blank=True,
                                        null=True,
                                    )
    date_posted = models.DateTimeField(default=timezone.now)
    updated     = models.DateTimeField(auto_now=True)
    slug        = models.SlugField(max_length=70, blank=True, null=True, help_text='<font color="red">don\'t. touch. the. slug. field. unless. you. mean. it.</font> (it will auto-generate, don\'t worry.)')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:post-detail', kwargs={'slug': self.slug})

最后是与post_list.html相关的视图:

class PostListView(ListView):
    model = Post
    template_name = 'blog/home.html'
    context_object_name = 'posts'
    ordering = '-date_posted'
    paginate_by = 6

我想知道我应该以完全不同的方式来做吗?如果是这样,什么被认为是“最佳实践”?

谢谢:)

1 个答案:

答案 0 :(得分:0)

您可以在模型中添加顺序:

public class MyFragment extends Fragment implements SearchActivity.goBack{
@Override
public boolean canGoBack() {
    if (webView.canGoBack()) {

        webView.goBack();
        return true;
    }
    return false;
}

有关更多详细信息,请参见documentation

更新

为此最好使用custom manager

class Post(models.Model):
   ...
   class Meta:
      ordering = ['category', '-date_posted']

用法:

from django.db import models

class CustomManager(models.Manager):
    # subclass model manager
    def custom_category_dict(self, **kwargs):
        # add a new method for building a dictionary
        nDict = dict()
        for i in self.get_queryset().filter(**kwargs):  # filter queryset based on keyword argument passed to this method
            current_list = nDict.get(i.category.name, [])
            current_list.append(i)
            nDict.update({i.category.name: current_list})
        return nDict

class Posts(models.Model):
    # override posts model with manager
    objects = CustomManager()