1

在我的项目中,我有 2 个模型文章和报价。用户每次点击主页上的一个按钮,就会将相关的引用添加到用户的文章中。

Article.models 如下所示:

class Article(models.Model):
    user = models.OneToOneField(User, null=True)
    quote = models.ManyToManyField(Quote, blank=True, null=True)
    def __unicode__(self):
        return self.user.username

这是view.py

def add_quote(request, id):
    u = User.objects.get(username=request.user)
        a = Article.objects.get(user=u)
    q = Quote.objects.get(id=id)
    a.quote.add(q)
    a.save()

    return HttpResponseRedirect(reverse("home"))

主页.html:

{% for quote in quotes %}
<p>{{ quote.description }}</p> 
<p><a class="btn btn-primary" href="{{ quote.get_absolute_url }}"
role="button" data-container="body" data-toggle="popover" 
data-placement="top" data-content="added">collect &raquo;</a></p>

它确实有效。但是,它也会重新加载主页。因此,当我向下滚动并单击按钮时,页面会返回顶部并且不会停留在我单击的位置。

我做了一些研究,发现 dajax 可能会有所帮助,但只是不知道如何用它或其他有效方式解决我的问题?

4

1 回答 1

1

有两种方法可以解决这个问题,我建议您同时实现它们。

1.无Javascript的方法。

包括每个报价的锚点,因此当您重定向时,您可以像这样重定向:

HttpResponseRedirect(reverse("home")+"#quote_id_%s"%(q.id))

看起来像:

http:example.com#quote_id_123

并跳转到具有该 id 的元素,例如:

<blockquote id="quote_id_123">Four score and seven years ago...</blockquote>

这意味着没有 Javascript(这仍然是一个惊人的数量)的用户可以获得跳转到正确位置的功能。

为此,您可以像这样更改 for 循环:

{% for quote in quotes %}
    <p id="quote_id_{{quote.id}}">{{ quote.description }}</p> 
    <p><a class="btn btn-primary" href="{{ quote.get_absolute_url }}"
    <!-- etc ... -->
{% endfor %}

2.使用渐进增强添加Javascript

这不那么直接,并且需要编写比上面更多的代码,但基本上需要通过一些 ajax 方法提交表单,正确捕获响应(或错误)并更新页面。

Dajax 和 jQuery 可能会在这方面有所帮助,但会非常适合您的站点。

于 2015-02-06T05:22:16.343 回答