python - 喜欢不喜欢使用自定义模板标签切换
问题描述
我希望按钮内的文本在喜欢和不喜欢之间切换。我正在尝试使用自定义模板标签来完成此操作。喜欢和不喜欢正在起作用,模型正在更新。只想让按钮在喜欢和不喜欢之间切换!
我已经创建了模板标签文件夹。只需要帮助在 post_extras.py 中创建模板标签函数以及如何在模板中调用该函数
post_extras.py
from django import template
register = template.Library()
@register.simple_tag(takes_context=True)
def isliked(context,entry):
if entry.filter(id=context['request'].post.id).exists():
return "Unlike"
else:
return "Like"
like_section.html
{% load post_extras %}
{{ entry.total_likes }} Like{{ entry.total_likes | pluralize }}
<form action="{% url 'like_post' %}" method="POST">
{% csrf_token %}
<input type="submit" name="{{ entry.id }}" value="like" class="btn
btn-primary like"/>
</form>
模型.py
class Post(models.Model):
user= models.ForeignKey(User, on_delete=models.CASCADE)
heading = models.CharField(max_length=200, null=False)
text = models.TextField(null=False)
created_date=models.DateTimeField(default=timezone.now)
pic = models.ImageField(upload_to='image', blank='True')
def __str__(self):
return self.heading
def getuser(self):
return self.user.username
def total_likes(self):
return Like.objects.filter(post=self).count()
class Like(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE)
post = models.ForeignKey(Post,on_delete=models.CASCADE)
def __str__(self):
return self.post.heading
阿贾克斯代码:
$(document).on('click','.like',function(e) {
e.preventDefault();
var pks=$(this).attr('name');
console.log('primarys : '+ pks);
$.ajax({
type:'POST',
url:'like/',
data:{
'ids': pks,
csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val()
},
success:function (response) {
$(e.target).parents('.like-section').html(response);
console.log(response)
console.log("liked");
},
error: function(rs,e){
console.log(rs, e.responseText);
console.log('ERROR');
},
});
});
视图.py
def like_post(请求):
post = get_object_or_404(Post, id=request.POST.get('ids'))
like=Like.objects.filter(user=request.user, post=post)
if like.exists():
like.delete()
else:
Like.objects.create(user=request.user, post=post)
send_mail(
'Post Liked',
'Your Post "'+ post.heading + '" has been liked by '+request.user.username,
'mohitharshan123@gmail.com',
[post.user.email],
fail_silently=False,
)
context= {
'entry': post,
}
if request.is_ajax():
html = render_to_string('accounts/like_section.html', context, request=request)
return HttpResponse(html)
解决方案
据我了解,帖子Liked
是否存在于Like
模型中。
解决方案:
from django import template
# import `Like` model
from path.to.models import Like
register = template.Library()
@register.simple_tag
def isliked(post):
if Like.objects.filter(post=post).exists():
return "Like"
return "Unlike"
然后,您可以将其加载到模板中:{% load isliked %}
.
并且,然后通过传递Post
模型实例来使用它:{% isliked post %}
。
推荐阅读
- reactjs - 传递应该抛出的对象时,打字稿不会抛出错误
- r - pscl 跨栏模型计数预测 < 响应预测
- php - Laravel - 当我有许多字段的表单时我应该如何存储数据
- javascript - 类型 'boolean' 不可分配给类型 'Promise
' - django - 无法通过 Django 中的 BooleanField 过滤对象
- php - Postgres PHP查询多个值并按顺序在conlums html中打印结果
- angular - Angular LoggedIn 方法
- google-sheets - 使用同一列的计数和透视查询
- c++ - 使用类 c++ 显示 2 名员工之间输入最多的薪水
- typescript - 打字稿泛型,无需函数调用即可推断对象属性类型