根据 usr django 之前的 "liked" 状态更改按钮
change button based on previously "liked" status by usr django
我是 Django 的新手,正在尝试创建一个最喜欢的应用程序。
我想根据用户是否已经收藏了医生来更改喜欢的按钮。
我将 physicians 和 liked 列表传递到我的模板,但不确定接下来要做什么才能从数组中提取 liked,也不确定这是否是处理此问题的最优雅方法。
如有任何帮助,我们将不胜感激!
models.py
class Physician(models.Model):
speciality = models.CharField(null=False, blank=False, max_length=30)
first_name = models.CharField(null=False, blank=False, max_length=50)
last_name = models.CharField(null=False, blank=False, max_length=50)
title = models.CharField(null=False, blank=False, max_length=2)
address1 = models.CharField(null=False, blank=True, max_length=50)
address2 = models.CharField(null=True, blank=True, max_length=20)
city = models.CharField(null=False, blank=False, max_length=50)
state = models.CharField(null=False, blank=False, max_length=2)
zip = models.CharField(null=False, blank=False, max_length=12)
likes = models.IntegerField(default=1)
def __str__(self):
template = '{0.last_name} {0.first_name} {0.speciality}'
return template.format(self)
class Voter(models.Model):
user = models.ForeignKey(User)
physician = models.ForeignKey(Physician)
我的模板是
{% if physicians %}
{% for physician in physicians %}
<tr>
<td>
<a href="/getmd/{{physician.id}}/">
{{ physician.last_name }}, {{ physician.first_name }} </a>
</td>
<td>{{ physician.state }}</td>
<td>{{ physician.speciality }}</td>
<td>{{ physician.id}}</td>
<td><strong id="like_count{{physician.id}}">{{ physician.likes }}</strong> </td>
<td>
{% if user.is_authenticated %}
{% if likedalready.physician].liked %}
<button id="alreadyvoted" data-catid="{{physician.id}}" class="likes btn btn-secondary" type="button" title="Already faved">
<span class="glyphicon glyphicon-check"></span>
Faved
</button>
{%else%}
<button id="{{physician.id}}like" data-catid="{{physician.id}}" class="likes btn btn-primary" type="button" title="Fave Me">
<span class="glyphicon glyphicon-thumbs-up"></span>
Fav
</button>
{% endif %}
{% endif %}
</td>
</tr>
{% endfor %}
{% else %}
<p>Sign in to fave</p>
{% endif %}
</tbody>
我的views.py
def 医生(请求):
user = User;
liked = False;
args = {}
args.update(csrf(request))
physicians = Physician.objects.all().order_by('last_name')
page = request.GET.get('page', 1)
paginator = Paginator(physicians, 10)
try:
physicians = paginator.page(page)
except PageNotAnInteger:
physicians = paginator.page(1)
except EmptyPage:
physicians = paginator.page(paginator.num_pages)
#Create list of already liked physicians
return_list = []
for physician in physicians:
liked = Voter.objects.filter(physician_id=physician.id, user_id=request.user.id).exists()
return_list.append((physician, {'liked': liked}))
args['physicians'] = physicians
return render(request, 'physicians.html', args, {'liked': return_list})
首先改变你的模型设计,
删除选民模型并在医师模型中添加 ManyToMany 字段。同时从 Physician 模型中删除 likes 属性,
class Physician(models.Model):
....
#users liked the physcian
likers = models.ManyToManyField(User, related_name='liked_physicians')
views.py
context['physicians'] = Physician.objects.all().annotate(
total_likes=Count('likers')
)
写一个模板标签来检查(count/exists)登录用户是否喜欢医生
@register.filter
def is_liker(physician, user):
return physician.likers.filter(id=user.id).exists()
模板
{% for physician in physicians %}
{% if physcian|is_liker:request.user == True %}
liked
{% else %}
<button>Like</button>
{% endif %}
{% endfor %}
我想要一个不同的模型,比如:
class Like(models.Model):
user = models.ForeignKey(User)
physician = models.ForeignKey(Physician)
这table将在用户和医生之间建立关系。
您可以知道用户是否喜欢医生。
Like.objects.filter(user=user, physician=physician).exists()
如果用户 un-favorites 医生等等,则删除关系。
要获取用户喜欢的所有医生id,你可以这样做:
physicians_liked = Like.objects.filter(user=user).values_list('physician', flat=True)
稍后在您的模板中就像检查一样容易:
{% if physician.id in physicians_liked %}
...
{% endif %}
我是 Django 的新手,正在尝试创建一个最喜欢的应用程序。 我想根据用户是否已经收藏了医生来更改喜欢的按钮。
我将 physicians 和 liked 列表传递到我的模板,但不确定接下来要做什么才能从数组中提取 liked,也不确定这是否是处理此问题的最优雅方法。
如有任何帮助,我们将不胜感激!
models.py
class Physician(models.Model):
speciality = models.CharField(null=False, blank=False, max_length=30)
first_name = models.CharField(null=False, blank=False, max_length=50)
last_name = models.CharField(null=False, blank=False, max_length=50)
title = models.CharField(null=False, blank=False, max_length=2)
address1 = models.CharField(null=False, blank=True, max_length=50)
address2 = models.CharField(null=True, blank=True, max_length=20)
city = models.CharField(null=False, blank=False, max_length=50)
state = models.CharField(null=False, blank=False, max_length=2)
zip = models.CharField(null=False, blank=False, max_length=12)
likes = models.IntegerField(default=1)
def __str__(self):
template = '{0.last_name} {0.first_name} {0.speciality}'
return template.format(self)
class Voter(models.Model):
user = models.ForeignKey(User)
physician = models.ForeignKey(Physician)
我的模板是
{% if physicians %}
{% for physician in physicians %}
<tr>
<td>
<a href="/getmd/{{physician.id}}/">
{{ physician.last_name }}, {{ physician.first_name }} </a>
</td>
<td>{{ physician.state }}</td>
<td>{{ physician.speciality }}</td>
<td>{{ physician.id}}</td>
<td><strong id="like_count{{physician.id}}">{{ physician.likes }}</strong> </td>
<td>
{% if user.is_authenticated %}
{% if likedalready.physician].liked %}
<button id="alreadyvoted" data-catid="{{physician.id}}" class="likes btn btn-secondary" type="button" title="Already faved">
<span class="glyphicon glyphicon-check"></span>
Faved
</button>
{%else%}
<button id="{{physician.id}}like" data-catid="{{physician.id}}" class="likes btn btn-primary" type="button" title="Fave Me">
<span class="glyphicon glyphicon-thumbs-up"></span>
Fav
</button>
{% endif %}
{% endif %}
</td>
</tr>
{% endfor %}
{% else %}
<p>Sign in to fave</p>
{% endif %}
</tbody>
我的views.py def 医生(请求):
user = User;
liked = False;
args = {}
args.update(csrf(request))
physicians = Physician.objects.all().order_by('last_name')
page = request.GET.get('page', 1)
paginator = Paginator(physicians, 10)
try:
physicians = paginator.page(page)
except PageNotAnInteger:
physicians = paginator.page(1)
except EmptyPage:
physicians = paginator.page(paginator.num_pages)
#Create list of already liked physicians
return_list = []
for physician in physicians:
liked = Voter.objects.filter(physician_id=physician.id, user_id=request.user.id).exists()
return_list.append((physician, {'liked': liked}))
args['physicians'] = physicians
return render(request, 'physicians.html', args, {'liked': return_list})
首先改变你的模型设计,
删除选民模型并在医师模型中添加 ManyToMany 字段。同时从 Physician 模型中删除 likes 属性,
class Physician(models.Model):
....
#users liked the physcian
likers = models.ManyToManyField(User, related_name='liked_physicians')
views.py
context['physicians'] = Physician.objects.all().annotate(
total_likes=Count('likers')
)
写一个模板标签来检查(count/exists)登录用户是否喜欢医生
@register.filter
def is_liker(physician, user):
return physician.likers.filter(id=user.id).exists()
模板
{% for physician in physicians %}
{% if physcian|is_liker:request.user == True %}
liked
{% else %}
<button>Like</button>
{% endif %}
{% endfor %}
我想要一个不同的模型,比如:
class Like(models.Model):
user = models.ForeignKey(User)
physician = models.ForeignKey(Physician)
这table将在用户和医生之间建立关系。 您可以知道用户是否喜欢医生。
Like.objects.filter(user=user, physician=physician).exists()
如果用户 un-favorites 医生等等,则删除关系。
要获取用户喜欢的所有医生id,你可以这样做:
physicians_liked = Like.objects.filter(user=user).values_list('physician', flat=True)
稍后在您的模板中就像检查一样容易:
{% if physician.id in physicians_liked %}
...
{% endif %}