根据 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 %}