【发布时间】:2021-05-01 00:38:25
【问题描述】:
Homefeed 是我查询所有博文的页面
在这个项目中,任何看到他们感兴趣的博文的用户都可以将他们的兴趣提交给博文。 1 位用户只能对该博文提交 1 个兴趣,但他们可以向不同的博文提交任意数量的兴趣。
现在在我的 home.html 中,我正在尝试使如果您已提交对该特定博客文章的兴趣(也就是您的兴趣状态为待处理或接受或拒绝),您将看到查看兴趣按钮而不是提交兴趣按钮。
但我面临一个问题,因为在我看来,我查询的是blog_posts = BlogPost.objects.all() 而不是blog_post = get_object_or_404(BlogPost, slug=slug)。因此,我如何能够查询对于特定的博文,用户是否已经提交了对我的模板的兴趣以确定应该在我的 home.html 中显示哪个按钮?谢谢,我也不想更改网址:)
views.py
def home_feed_view(request, *args, **kwargs):
context = {}
blog_posts = BlogPost.objects.all()
context['blog_posts'] = blog_posts
page = pageFilter(request.GET, queryset=BlogPost.objects.exclude(author_id=request.user.id).order_by('date_updated'))
context['page'] = page
paginated_page = Paginator(page.qs, 4)
page = request.GET.get('page')
page_obj = paginated_page.get_page(page)
context['page_obj'] = page_obj
return render(request, "HomeFeed/snippets/home.html", context)
home.html
{% for post in page_obj %}
{% if post.interest_set.exists and request.user.is_authenticated %}
<a class="btn btn-info btn-sm" href="{% url 'HomeFeed:submitinterest' post.slug %}">View Interest</a>
{% else %}
<a class="btn btn-warning btn-sm" href="{% url 'HomeFeed:submitinterest' post.slug %}">Submit Interest</a>
{% endif %}
{% endfor %}
urls.py
path('', home_feed_view , name= "main"),
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)
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)
objects= models.Manager
views.py
type = TypeFilter(request.GET, queryset=BlogPost.objects.exclude((Q(author_id__in=request.user.blocked_users.all()) | Q(author = request.user))).order_by('date_updated')).annotate(user_has_interest=Case(When(interest__user=request.user, then=Value(True)), default=False, output_field=BooleanField()))
使用 Django 过滤器: 过滤器.py
class TypeofIdeaFilter(django_filters.FilterSet):
title = django_filters.CharFilter(field_name="title", lookup_expr='icontains')
class Meta:
model = BlogPost
【问题讨论】:
标签: django django-models django-views django-forms django-templates