2015-02-06 34 views
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")) 

的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可能会帮助,但不知道如何解决我的问题或其他有效的方式吗?

回答

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可能会在这方面提供帮助,但会对您的网站非常具体。

+0

非常感谢Sam。第一种方法工作得很好。请问你能告诉我更多关于第二种方法的信息吗? – Leonsion 2015-02-06 09:09:21

相关问题