首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django根据条件更改模板上的<a>标记

Django根据条件更改模板上的<a>标记
EN

Stack Overflow用户
提问于 2022-04-13 10:29:46
回答 1查看 38关注 0票数 0

我有可以选择保存它的帖子。视图工作正常,但我看不到按钮中的变化。我希望当它没有被用户保存时,按钮上写着“保存帖子”,当它已经保存时,按钮应该说“取消保存”。最后这部分我有问题了。这是代码的一部分。

views.py

代码语言:javascript
复制
def post(request):
    posts = Post.objects.all().order_by("-date_created")
    return render(request, "post/food-feed.html", {"posts": posts})

def save_post(request, pk):
    post = get_object_or_404(Post, id=pk)
    if post.favorite_posts.filter(id=request.user.id).exists():
        post.favorite_posts.remove(request.user)
    else:
        post.favorite_posts.add(request.user)
    return HttpResponseRedirect(request.META["HTTP_REFERER"])

模板

代码语言:javascript
复制
<a href="{% url 'save-post' post.id %}" class="btn btn-primary float-start">Save post</a> 

urls.py

代码语言:javascript
复制
path("post/<int:pk>/save", views.save_post, name="save-post")

forms.py

代码语言:javascript
复制
class UserSignupForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ["username", "email", "password1", "password2"]

    def clean_username(self):
        username = self.cleaned_data["username"].lower()

        if not re.match(r"^[A-Za-z0-9_]+$", username):
            raise forms.ValidationError(
                "Sorry, your username must only contain letters, numbers and underscores."
            )

        elif (
            User.objects.exclude(pk=self.instance.pk).filter(username=username).exists()
        ):
            raise forms.ValidationError(f"Username {username} is already in use.")
        else:
            return username

models.py

代码语言:javascript
复制
class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=80)
    slug = models.SlugField(max_length=250, null=True, blank=True)
    post_description = models.TextField(max_length=140, null=True, blank=True)
    date_created = models.DateTimeField(default=timezone.now)
    date_updated = models.DateTimeField(auto_now=True)
    main_image = models.ImageField(upload_to="post_pics")
    is_recipe = models.BooleanField()
    ingredients = models.TextField(blank=True, null=True)
    recipe_description = models.TextField(blank=True, null=True)
    cooking_time = models.CharField(max_length=20, blank=True, null=True)
    likes = models.ManyToManyField(User, related_name="post_likes")
    loves = models.ManyToManyField(User, related_name="post_loves")
    drooling_faces = models.ManyToManyField(User, related_name="post_drooling_faces")
    favorite_posts = models.ManyToManyField(
        User, related_name="favorite_posts", default=None, blank=True
    )

    def clean(self, *args, **kwargs):
        if (
            (self.is_recipe and self.ingredients == None)
            or (self.is_recipe and self.ingredients == None)
            or (self.is_recipe and self.recipe_description == None)
            or (self.is_recipe and self.cooking_time == None)
        ):
            raise ValidationError("You need to complete the recipe fields!")
        if not self.slug:
            slug_title = slugify(self.title)
            slug_date = slugify(self.date_created)
            self.slug = f"{slug_title}-{slug_date}"
        super().clean(*args, **kwargs)

    class Meta:
        ordering = ("-date_created",)

    def save(self, *args, **kwargs):
        self.full_clean()
        return super().save(*args, **kwargs)

    def __str__(self) -> str:
        return self.title

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

    def like_count(self):
        return self.likes.count()

    def love_count(self):
        return self.loves.count()

    def droolingface_count(self):
        return self.drooling_faces.count()

每一篇文章都显示在用户图片、用户名、日期、照片、标题、喜欢、描述和保存按钮中,我需要添加哪些内容才能使语句工作呢?

EN

回答 1

Stack Overflow用户

发布于 2022-04-13 10:41:29

您可以使用queryset指定或自定义筛选标记。我不认识你的模特。但是您可以在post视图中注释类似于以下内容的is_favorite:

代码语言:javascript
复制
from django.db.models import Exists, OuterRef

Post.objects.annotate(
    is_favorite=Exists(
        Favorite.objects.filter(user=user, product_id=OuterRef('pk'))
    )
)

在模板中:

代码语言:javascript
复制
{% if post.is_favorite %}
save
{% else %}
unsave
{% endif %}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71855965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档