django处理多个id

时间:2014-10-29 05:16:52

标签: python django

我有一个模特

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

我想要实现的是获取尚未查看的通知,以及用户查看通知的时间应设置为Viewed = True。

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

这里我希望在用户转到问题的详细信息视图时将通知设置为已查看。

我的模板文件是

{% 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"),

这里我想设置要查看的通知= True。如何获取通知的ID。在网址中,我已经得到了问题的身份。

2 个答案:

答案 0 :(得分: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

<强>已更新

要将完全通知标记为已查看,请在网址中提供相应的通知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 %}

答案 1 :(得分:0)

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