Django 私有(private)帖子和公共(public)帖子示例?

标签 django python-3.x model private public


我正在开发一个 Django 应用程序,它有私有(private)部分和公共(public)部分。我怎样才能用 django 开发这样的应用程序?我尝试过使用模型管理器和模板标签,但都没有将用户的帖子设为私有(private),并且在发布后他们可以通过 bool 字段将帖子设为公开或私有(private)。 以下是我的帖子模型:

from __future__ import unicode_literals

from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.db import models
from django.db.models.signals import pre_save
from django.utils import timezone
from django.utils.safestring import mark_safe
from django.utils.text import slugify

from markdown_deux import markdown
from comments.models import Comment

from .utils import get_read_time



class PostManager(models.Manager):
    def active(self, *args, **kwargs):
        # Post.objects.all() = super(PostManager, self).all()
        return super(
            PostManager,
            self).filter(draft=False).filter(publish__lte=timezone.now())

    def public_post(self, *args, **kwargs):
        return super(
            PostManager,
            self).filter(public=True)

    def private_post(self, *args, **kwargs):
        return super(
            PostManager,
            self).filter(public=False)


def upload_location(instance, filename):
    return "%s/%s.%s" % (instance.id, instance.id, filename)

class Post(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    title = models.CharField(max_length=120)
    slug = models.SlugField(unique=True, allow_unicode=True)
    image = models.ImageField(
        upload_to=upload_location,
        null=True,
        blank=True,
        width_field="width_field",
        height_field="height_field")
    height_field = models.IntegerField(default=0)
    width_field = models.IntegerField(default=0)
    content = models.TextField()
    draft = models.BooleanField(default=False)
    publish = models.DateField(auto_now=False, auto_now_add=False)
    read_time = models.IntegerField(
        default=0)  # models.TimeField(null=True, blank=True) 
    public = models.BooleanField(default=False)
    private = models.BooleanField(default=True)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    objects = PostManager()

    def __unicode__(self):
        return self.title

    def __str__(self):
        return self.title

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

    class Meta:
        ordering = ["-timestamp", "-updated"]

    def get_markdown(self):
        content = self.content
        markdown_text = markdown(content)
        return mark_safe(markdown_text)

    def save(self,
             force_insert=False,
             force_update=False,
             using=None,
             update_fields=None):
        from unidecode import unidecode
        from django.template import defaultfilters
        if not self.title == "":
            self.slug = defaultfilters.slugify(unidecode(self.title))
        super(Post, self).save()

    @property
    def comments(self):
        instance = self
        qs = Comment.objects.filter_by_instance(instance)
        return qs

    @property
    def get_content_type(self):
        instance = self
        content_type = ContentType.objects.get_for_model(instance.__class__)
        return content_type

    @property
    def is_public(self):
        return self.public
    @property
    def is_private(self):
        return self.private


def create_slug(instance, new_slug=None):
    slug = slugify(instance.title)
    if new_slug is not None:
        slug = new_slug
    qs = Post.objects.filter(slug=slug).order_by("-id")
    exists = qs.exists()
    if exists:
        new_slug = "%s-%s" % (slug, qs.first().id)
        return create_slug(instance, new_slug=new_slug)
    return slug


def pre_save_post_receiver(sender, instance, *args, **kwargs):
    if not instance.slug:enter code here
        instance.slug = create_slug(instance)

    if instance.content:
        html_string = instance.get_markdown()
        read_time_var = get_read_time(html_string)
        instance.read_time = read_time_var


pre_save.connect(pre_save_post_receiver, sender=Post)

最佳答案

您正在提取所有私有(private)帖子,而您真正想要的是某个特定用户的所有私有(private)帖子。

你应该做的是这样的:

class PostManager(models.Manager):
    def active(self, *args, **kwargs):
        # Post.objects.all() = super(PostManager, self).all()
        return super(
            PostManager,
            self).filter(draft=False).filter(publish__lte=timezone.now())

    def public_posts(self, *args, **kwargs):
        return super(PostManager, self).filter(public=True)

    # This sounds better plural, no?
    def private_posts(self, *args, **kwargs):
        user = kwargs.pop('user')
        return super(PostManager, self).filter(public=False, user=user)

然后在其他地方,您可以像这样提取私有(private)帖子:

def some_view(request):
    private_posts = Post.objects.private_posts(user=request.user)

这应该返回用户与发出请求的用户匹配的所有私有(private)帖子。

关于Django 私有(private)帖子和公共(public)帖子示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48069710/

相关文章:

python - 从URL上传Django ImageField

Python 解决方案允许通过电子邮件将照片上传到我的 Django 网站

python - 没有名为 'polls.apps.PollsConfigdjango' 的模块; Django项目教程2

java - 将脚本转换为 exe 时无法执行我的脚本

ruby-on-rails - 从另一个模型文件调用方法

asp.net-mvc - 我们应该如何将数据传递到大型 ASP.NET MVC 网站中的 View

javascript - 具有动态参数的主干模型 url

Django 1.8.5 allauth 和项目应用程序名称冲突

python - 为什么我的 'button.bind' 不会调用 'makeChoice' ?

python - “模块”对象没有属性 'STARTUPINFO'