0

这是我的问题:

我有一个消息列表,可以使用同一页面上的表单进行过滤。此外,我可以通过单击在列表下方显示其中一条消息。

我的问题是,如果我过滤列表然后选择一条消息来显示它,过滤列表的 GET 数据将“丢失”。因此,所有消息都会再次显示在列表中。

当我单击消息时,如何显示消息并保持列表不变?

我的网址:

url(r'^inbox/$', view='inbox', name="kernel-networking-messages-inbox"),
url(r'^inbox/(?P<message_pk>\d+)/$', view='inbox_message', name="kernel-networking-messages-inbox-read"),

我的看法:

class InboxView(SearchViewMixin):
    template_name = "kernel/networking/messages/inbox.html"
    form_class = InboxForm

inbox = InboxView.as_view()

class InboxMessageView(InboxView):
    def dispatch(self, request, *args, **kwargs):
        self.message = get_object_or_404(Message, pk=kwargs['message_pk'])
        return super(InboxMessageView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(InboxMessageView, self).get_context_data(**kwargs)
        context['message'] = self.message
        return context

inbox_message = InboxMessageView.as_view()

收件箱.html:

<form action="" method="get">
...
<input type="submit" value="Search"/>
<table>
...
</table>
{% if message %}
// display message
{% endif %}

我试图尽可能清楚:/

4

1 回答 1

1

我看到两个选项。

1:使用Django的会话框架

当您收到过滤请求时,将过滤器选项存储在会话中:request.session['filter_options'] = filter_option_dict

然后,当您加载页面并且在 request.GET 中看不到任何过滤选项时,请检查会话中是否有任何选项:

if(len(request.GET) > 0):
    #get filter options from request.GET
    #save filter options to session
elif('filter_options' in request.session):
    #get filter options from session
else:
    #no filter options, display without filtering

请注意,会话是为临时数据设计的,并且特定于一台计算机上的一个浏览器。对于这个用例来说,这不是问题,但要记住这一点。

2:使用ajax加载消息而不改变页面的其余部分。在服务器上,您创建一个视图,该视图返回没有页面标题或任何其他格式的消息,并在前端创建 javascript 以发送请求并将检索到的消息插入页面。使用 JQuery 很容易做到这一点,尽管没有它也可以做到。

这将是我的首选解决方案,因为从用户的角度来看,以交互方式更新自己的网站比每次点击链接时都必须刷​​新的网站感觉要好得多。

于 2012-06-20T15:36:47.377 回答