2014-10-29 84 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,然後保存(),它將工作