0

我有一个超级喜欢 django 应用程序。客户可以发出信号,表明他们正在寻找提供服务的人,并且同一地区正在寻找服务提供者的人可以查看积极寻找客户的列表。当客户按下表示他们正在寻找服务的按钮时,他们会被重定向到一个页面,上面写着“谢谢,有人在路上时会通知您”,并将属性设置activeTrue。这会将它们显示在前面提到的可以“认领”客户的列表中。当服务提供商声明客户时。我希望客户的页面显示“有人很快就会到”或类似的东西。但是我怎样才能让客户的页面(customer_active.html)知道active已设置为False(即他们已被认领)然后显示有关该事件发生的消息?我已经阅读了有关可能使用 django 信号或 ajax/jquery 的信息,但我不知道正确的路线是什么,也不知道如何在所述路线中实施解决方案。我有以下代码:

模型.py:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Profile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)

    active = models.BooleanField(default = False)

网址.py

urlpatterns = [
    #home 
    url(r'^home/$', views.home, name = 'home'),

    #/claim/user_id
    url(r'^claim/(?P<user_id>[0-9]+)/$', views.ClaimView.as_view(), name = "claim"),


    #/active
    url(r'^active/$', views.customer_active, name='customer_active'),


]    

    def __str__(self):
        return self.user.username

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

customer_active.html(客户在表示他们正在寻找服务后正在查看此内容):

{% extends 'core/base.html' %}

{% block head %}

    {% load static %}
    <link rel="stylesheet" href="{% static 'core/customer_active.css' %}">

    <title>Active</title>
{% endblock %}
{% block body %}
        <div class="container text-center">
            <div class="row">
                <div class="col-md-12 mb-3">
                    <h1 class="lead">Thank you, {{ user.first_name}} {{user.last_name }}, you will be alerted
                    when someone claims your laundry</h1>
                </div>
            </div>
        </div>


{% endblock %}

主页.html:

{% for customer in customers%}
                            <tr>
                                <td style = "text-align:center">{{ customer.user.first_name|title }} {{ customer.user.last_name|title }}</td>
                                <td style = "text-align:center">{{ customer.user.profile.address|title }}</td>
                                <td style = "text-align:center"><a href="{% url 'claim' user_id=customer.user.id %}">Claim</a></td>
                            </tr>
{% endfor %}

视图.py:

#the service provider that claimed a customer gets redirected to 'claim.html', upon this 'active' gets set to False
class ClaimView(View):
    def get(self, request, user_id, *args, **kwargs):
        customer = User.objects.get(id=user_id)
        customer.profile.active = False
        customer.save()
        return render(request, 'core/claim.html', {'customer': customer})

def customer_active(request):
    request.user.profile.active = True;
    request.user.save()
    return render(request, 'core/customer_active.html', {'user': request.user})

当服务提供商声称客户时,如何使用 ajax/jquery 在 customer_active.html 中显示一条消息“有人很快就会到”?

4

1 回答 1

0

所以..如果客户在 customer_active.html 页面中,当服务提供商声称客户时,应该在 customer_active.html 页面中提醒客户。如果我正确地理解了这个问题,那么就需要创建一个定时器,每隔几秒发送一次 Ajax 调用,以检查服务提供商是否已认领客户。

    setInterval(function(){
        minAjax({
           url:"/serviceprovider/",//request URL
           type:"GET",//Request type GET/POST
           //CALLBACK FUNCTION with RESPONSE as argument
           success: function(data){
               //check if someone has claimed
               if (data == true){
                   alert("Someone will be there shortly");
               }
           }
       });
     }, 5000); //5000 represents 5 seconds

视图.py

@login_required
def serviceprovider(request):
    claimed=False
    claim=Model.objects.filter(user=User.objects.get(username=request.user), claimed=True)
    if claim:
       claimed=True
    return HttpResponse(json.dumps(claimed))

网址.py

url(r'^serviceprovider/', views.serviceprovider, name = 'serviceprovider'),

你需要minAjax才能工作,它是一个使用纯 JavaScript 的非常小的库。只需下载库并将其放入您的 js 文件夹中,然后导入即可。我没有测试上面的例子,但是我在一个项目中使用了这个方法并且它有效。这只是为了引导你走向正确的方向。祝你好运!

于 2017-08-27T00:37:31.453 回答