【问题标题】:How to query the blogpost wihtout slug as my function argument?如何在没有 slug 作为我的函数参数的情况下查询博客文章?
【发布时间】:2021-04-30 01:09:02
【问题描述】:

对不起,我对 Django 很陌生。

好吧,在我的项目中,每篇博文都有自己的成员组。只有当您的兴趣状态为“已接受”时,您才是会员,并且您会自动添加到会员列表中。每个用户都可以对任何博文“提交兴趣”。

所以现在在用户的帐户页面上,我想查询用户是会员的博客文章(又名兴趣状态 = “接受”)

我还想查询用户已提交感兴趣并且正在等待被接受的所有博客文章。到(又名兴趣状态=“待定”,还不是会员)

如果你感到困惑,members 是 BlogPost 模型的一个字段,status 是 InterestInvite 模型的一个字段:).....

因此,在我的模板中,我希望拥有我所加入的所有博客文章的标题,以及我感兴趣的那些博客文章仍处于待显示状态的标题。当我单击标题时,我将被定向到该特定的博客文章。谁能分享这个查询是如何完成的?

我面临的问题是我不能在我的views.py 中使用blog_post = get_object_or_404(BlogPost, slug=slug),因为他们会说NameError,因为slug 没有定义。而且我的 Account 模型中没有外键到 BlogPost 模型。我的外键只在 BlogPost 模型中。

不确定是否有人对查询有任何解决方案以及如何在模板上显示信息。谢谢!

models.py

class Account(AbstractBaseUser):
 email                  = models.EmailField(verbose_name="email", max_length=60, unique=True)
 username               = models.CharField(max_length=30, unique=True)

class BlogPost(models.Model):
 title                  = models.CharField(max_length=50, null=False, blank=False, unique=True)
 author                     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
 slug                   = models.SlugField(blank=True, unique=True)
 members    = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="members")

class Interest(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
   blog_post = models.ForeignKey(BlogPost, on_delete=models.CASCADE)

class InterestInvite(models.Model):

   ACCEPT = "ACCEPT"
   DECLINE = "DECLINE"
   PENDING = "PENDING"
   STATUS_CHOICES = [
      (ACCEPT, "accept"),
      (DECLINE, "decline"),
      (PENDING, "pending"),

   ]

   interest = models.OneToOneField(Interest, on_delete=models.CASCADE, related_name="interest_invite")   
   status = models.CharField(max_length=25, choices=STATUS_CHOICES, default=PENDING)

urls.py

    path('<user_id>/', account_view, name="view"),

views.py

def account_view(request, *args, **kwargs):

 context = {}
 user_id = kwargs.get("user_id")
 try:
  account = Account.objects.get(pk=user_id)
  context['account'] = account

 except:
  return HttpResponse("Something went wrong.")
 if account:
  context['id'] = account.id
  context['username'] = account.username
  context['email'] = account.email
  context['profile_image'] = account.profile_image.url
  context['hide_email'] = account.hide_email
  context['biography'] = account.biography

  blog_posts = BlogPost.objects.filter(author=account)
  context['blog_posts'] = blog_posts

 return render(request, "account/account.html", context)

account.html

  {% if request.user in blog_post.members.all %}

  
  {% endif %}

【问题讨论】:

  • 我认为花更多时间研究文档是值得的。似乎您创建了几个具有不同用户名的帖子? link1link2 ...

标签: django django-models django-views django-forms django-templates


【解决方案1】:

Django 自动在您的 BlogPost 模型中设置一个自动 primary field。因此您可以通过以下方式访问它:

blog_post = get_object_or_404(BlogPost, pk=pk)

而且由于您有一个 ForeignKey 给用户,您可以查询以下所有内容:

user.blogpost_set.all() # get all blog posts of the user
user.interest_set.all() # get all interests of the user
user.interest_set.filter(
    interest_invite__status="PENDING"
) # get all interest with status pending of the user

或者你可以像这样通过用户模型:

User.objects.filter(
    blogpost__interest__interest_invite__status="PENDING"
).distinct() # get all users with interestinvite status PENDING

User.objects.filter(
    blogpost=b, blogpost__interest__interest_invite__status="ACCEPTED"
).distinct() # get all users of a specific BlogPost with status ACCEPTED

【讨论】:

  • 嗨@Marco 用户可以创建多个博客文章。用户只能对 1 篇博文提交 1 个兴趣,而对许多博文提交多个兴趣。只是为了确认一下,在我的情况下,我会将第二个框中的“用户”一词替换为“作者”,将第三个框中的“用户”替换为“帐户”,对吗?
  • 您可以随意调用用户。它必须是settings.AUTH_USER_MODEL Model 的一个实例。
  • 嗨,Marco,我也想检查一下,我了解递增自动字段,但是使用 pk=pk,视图会在 account.ok 和 blogpost.pk @Marco 之间混淆跨度>
  • 我不明白。通常,您不会在 URL 中没有用户 pk 和 blogpost pk。不过,这是完全可能的。
  • 不清楚您为什么会遇到此 BlogPost pk 问题,因为您的 account_view() 中不需要它,因此我们需要更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2022-12-22
  • 1970-01-01
相关资源
最近更新 更多