如何在基于类的通用视图中设置cookie

use*_*093 3 python django cookies django-views

django1.6的新手

我想在基于类的通用视图中设置cookie(Listview)

models.py

class Designation(Models.model):
    title = models.CharField(max_length=50)
    description = models.CharField(max_length=10000, blank=True)
Run Code Online (Sandbox Code Playgroud)

views.py

class DesignationList(ListVew):

    def get_queryset(self):
        """ 
        will get 'sort_by' parameter from request,
        based on that objects list is return to template
        """

        col_nm = self.request.GET.get('sort_by', None)


        if col_nm:
            if cookie['sort_on'] == col_nm:
                objects=Designation.objects.all().order_by(col_nm).reverse()
            else:
                cookie['sort_on'] = col_nm
                objects=Designation.objects.all().order_by(col_nm)  
        else:
            objects = Designation.objects.all().order_by('title')
            //set cookie['sort_on']='title'


    return objects
Run Code Online (Sandbox Code Playgroud)

模板 中的模板我迭代对象

所以最初的对象显示在sort_by'title'sdesc中."这个值是我想在cookie中设置的".

在模板中,如果用户点击标题,它将检入cookie cookie ['sort_on'] ='title',然后所有对象都按升序排列

如果用户点击描述,则cookie值被替换为cookie ['sort_on'] ='description',对象按顺序排列.

soo,如何设置我可以在整个ListView类中使用的cookie ..?

Thnx提前..

and*_*res 6

要设置/删除cookie,您必须有权访问"响应"对象.为此,在基于类的视图中,您可以覆盖"render_to_response".

例:

class DesignationList(ListVew):
    def render_to_response(self, context, **response_kwargs):
        response = super(LoginView, self).render_to_response(context, **response_kwargs)
        response.set_cookie('sort_on', 'title')
        return response
Run Code Online (Sandbox Code Playgroud)


Dan*_*man 2

除非你有充分的理由,否则你不应该使用cookie,而应该使用会话框架。您可以在方法中使用 来访问它self.request.session,它的作用就像一本字典。

    if col_nm:
        if self.request.session.get('sort_on') == col_nm:
            objects=Designation.objects.all().order_by(col_nm).reverse()
        else:
            self.request.session['sort_on'] = col_nm
            objects=Designation.objects.all().order_by(col_nm)  
Run Code Online (Sandbox Code Playgroud)

ETC。