2014-10-29 75 views
1

我有一个模型Django的处理多个ID

class Notification(models.Model): 

    user = models.ForeignKey(User) 
    title = models.CharField(max_length=150) 
    body = models.ForeignKey(Question) 
    viewed = models.BooleanField(default=False) 

    def __unicode__(self): 
     return self.title 

这里我要实现的就是让那些尚未查看的当用户查看该通知应设置为观看=真通知。

我的通知与信息和问题标题完美配合。当用户点击通知时,它会转到问题的详细视图。

在这里,我想让通知设置为当用户转到问题的详细视图时查看。

我的模板文件是

{% for notification in notifications %} 

<p><a href="{% url "question-detail" notification.body.id %}">{{notification.title}} </a></p> 
{{notification.body}} 


{% endfor %} 

查看我的问题细节的看法是:

class QuestionDetailView(DetailView): 

    context = {} 

    model = Question 
    template_name = "question-detail.html" 

    def get(self, request, pk, **kwargs): 

     self.pk = pk 

     return super(QuestionDetailView, self).get(request, pk, **kwargs) 

    def get_context_data(self, **kwargs): 

     context = super(QuestionDetailView,self).get_context_data(**kwargs) 

     context['question'] = Question.objects.get(pk=self.pk) 


     return context 

其网址为:

url(r'^question/(?P<pk>\d+)',QuestionDetailView.as_view(), name="question-detail"), 

在这里,我想设置的通知被视为=真。我怎样才能得到通知的ID。在URL中,我已经得到了问题的ID。

回答

2

首先,当你使用基于类的视图时,你不需要自己获取对象。 让我们简化您的详细视图:

class QuestionDetailView(DetailView): 
    model = Question 
    template_name = "question-detail.html" 
    context_object_name = 'question' 

这种观点会产生完全一样的行为,因为你的榜样。

接下来,让看去的设置与质疑通知:

class QuestionDetailView(DetailView): 
    model = Question 
    template_name = "question-detail.html" 
    context_object_name = 'question' 

    def get_context_data(self, **kwargs): 
     context = super(QuestionDetailView,self).get_context_data(**kwargs) 
     q = context['question'] 
     Notification.objects.filter(body=q, viewed=False).update(viewed=True) 
     return context 

修订

为了纪念确切通知看去,提供URL对应的通知ID。它可以在这里怎么做:

urls.py

(r'^question/(?P<pk>\d+)(?:/(?P<npk>\d+))?',QuestionDetailView.as_view(), name="question-detail"), 

views.py

class QuestionDetailView(DetailView): 
    model = Question 
    template_name = "question-detail.html" 
    context_object_name = 'question' 

    def get_context_data(self, **kwargs): 
     context = super(QuestionDetailView,self).get_context_data(**kwargs) 
     q = context['question'] 
     npk = kwargs.get('npk', None) 
     if npk: 
      Notification.objects.filter(pk=npk, body=q, viewed=False).update(viewed=True) 
     return context 

template.html

{% for notification in notifications %} 
    <p><a href="{% url "question-detail" notification.body.id notification.id %}">{{notification.title}} </a></p> 
    {{notification.body}} 
{% endfor %} 
+0

这没有奏效。这样做会将所有通知设置为与特定问题相关的已被视为= True。单个问题可能有多个通知。这样做,它会将所有通知设置为已阅读= True,而我希望特定通知为True。 – gamer 2014-10-30 13:10:29

+0

@Aeronn是的,这将设置**全部**通知,与当前问题相关,如同查看。您如何识别*特定*通知,即什么通知*特别*什么不是? – stalk 2014-10-30 13:18:24

+0

@Aeronn检查更新的问题 – stalk 2014-10-30 19:04:30

0

在这里你可以使用dajax技术,当用户点击通知,写入一个函数,如onclick =“MakeItAsTrue({{notificaation.id}})”,在这个函数中传递参数为notifiation id,在函数调用dajax并采取相应的用户,并使notifiation查看= True,然后保存(),它将工作