在使用动态数据的滑块中实现 jQuery

Posted

技术标签:

【中文标题】在使用动态数据的滑块中实现 jQuery【英文标题】:Implement jQuery in a slider that uses dynamic data 【发布时间】:2020-10-21 07:59:08 【问题描述】:

我正在尝试使用 jQuery 和 ajax 将带有动态数据的滑块添加到我的 django 项目中,我收到了制作上一个和下一个按钮的帮助,该按钮可以在配置文件中滑动,但我现在专注于上一个,在这个过程中我意识到代码中有一个 NoReverseMatch 错误,我不知道如何修复它们,因为我是 jQuery 和 ajax 的新手。

views.py

    def matesmain(request):
        contents = Mates.objects.all()
        context = 
            'contents': contents,
            'form_mates': MatesForm(),
        
        print("nice3")
        return render(request, 'mates.html', context)

    def previous(request):
        id= request.GET.get("id", None)
        if id != 1:
            previous_id= id-1
            prev_user= Mates.objects.filter(user= previous_id)
        data= 
            "username": prev_user.user,
            "req_bio": prev_user.req_bio,
            "req_image": prev_user.req_image,
        
        return JsonResponse(data)

models.py

     class Mates(models.Model):
         user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='usermates')
         users_requests = models.ManyToManyField(User, related_name="users_requests")
         req_bio = models.CharField(max_length=400)
         req_image = models.ImageField(upload_to='requestmates_pics', null=True, blank=True, default=False)

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        profile_pic = models.ImageField(upload_to='profile_pics', null=True, blank=True, default='default.png')
        bio = models.CharField(max_length=400, default=1, null=True)
        connection = models.CharField(max_length = 100, blank=True)
        follower = models.IntegerField(default=0)
        following = models.IntegerField(default=0)

urls.py

    urlpatterns = [
        path('mates', views.mates, name='mates'),
        path('mates-main', views.matesmain, name='mates-main'),
        path('previous', views.previous, name='previous'),
    ]

html

    <div class="mates-grid-1-1-content">
        <div class="mates-grid-2-content">
            <button type="button"  onclick="previous(user.id)" id="prev-button">prev</button>
        </div>
        <div class="mates-grid-1-content">
            <div class="mates-item-content">
                <img class="mate-pic" src=" user.profile.profile_pic.url " >
            </div>
            <div class="mates-item-content">
                <a href="% url 'profile' username=content.user.username %" style="float: left"> content.user </a>
            </div>
            <div class="mates-item-content">
                <div class="responses">
                    <div class="response-item-img">
                        <img class="mates-image" src=" content.req_image.url " >
                    </div>
                    <div class="response-item-bio">
                        <p> content.req_bio </p>
                    </div>
                    <div class="response-item-button">
                        <button type="submit">Submit</button>
                    </div>
                </div>
            </div>
        </div>
        <div class="mates-grid-3-content">
            <button type="button"  onclick="next(user.id)" id="next-button">next</button>
        </div>
    </div>

脚本

    function previous(id)
        $.ajax(
            url: '% url 'previous' %',
            type: "get",
            data: 
                'id': id,
            ,
            dataType: 'json',
            success: function (data) 

            $(".mates-item-content").empty();
            $(".mates-item-content").append("<img class="mate-pic" src=" user.profile.profile_pic.url " >");
            $(".mates-item-content").empty();
            $(".mates-item-content").append("<a href="% url 'profile' username=content.user.username %" style="float: left"> content.user </a>");
            $(".mates-item-content").empty();
            $(".mates-item-content").append("<img class="mates-image" src=" content.req_image.url " >");
            $(".mates-item-content").empty();
            $(".mates-item-content").append("<p> content.req_bio </p>");
            ,
            error: function (data) 
                alert('nope');
            
          );
        ; 
    

【问题讨论】:

这个示例代码有很多地方需要修复/改进。但首先,你的 JS 脚本是在同一个 HTML 文件中,还是在某个分开的 .js 文件中? @revliscano 它在同一个 html 文件中,我在这里将其分开,以便看起来更有条理 @revliscano 我应该在这里解决什么问题? 【参考方案1】:

您收到NoReverseMatch 异常,因为您没有在$.ajax() 函数内正确使用% url &amp; 标记。由于您在 HTML 本身中拥有该 javascript 代码,因此您可以用以下内容替换您拥有的内容:

url: "% url 'previous' %"

另外,在success 属性的回调函数中,您并没有使用从视图中获取的数据应该如何使用。请注意,您将无法在此回调中使用 Django 模板语言获取该数据,但您需要使用 JavaScript 来访问该数据。例如:

success: function(data)
    console.log(data.req_bio);

那是因为当 HTML 被 Django 渲染时,你可能想要在回调函数中使用的信息(例如: req.bio )还不会那里

不过,在处理 AJAX 响应时,有一种方法可以继续使用 Django 模板语言,即使用视图返回的上下文数据。请参阅this answer 了解更多信息。

【讨论】:

所以我应该有 console.log(data.req_bio) 和 console.log(data.req_image) 对吗? user.username 和 profile_pic 呢? console.log() 只是为了说明您将如何访问来自模板的数据。至于其他信息,由于它不是直接来自处理 AJAX 请求的视图,您可能希望将其传递给执行调用的 JavaScript 函数,然后在成功属性的函数中使用该数据。 尽管如此,在这种特殊情况下,由于您的 JS 在 HTML 本身中,并且您希望在成功属性的函数中使用 Django 呈现 HTML 时可用的信息,我想您可能使用模板语言(正如你所拥有的那样),它仍然可以工作。但恐怕这不是一个非常干净的方法。

以上是关于在使用动态数据的滑块中实现 jQuery的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个输入(旋钮)添加到单个滑块?

javascript 光滑的滑块 - 标签 - 使幻灯片显示动态

Swift 中的滑块弹出框

使用 jQuery 将幻灯片动态添加到 Bootstrap 3 轮播

如何在运行中向 jQuery 滑块添加多个句柄

如何使用 jQuery 中的滑块更改样式的值