标签: class-based-views

如何在基于django类的视图上使用permission_required装饰器

我在理解新CBV如何工作方面遇到了一些麻烦.我的问题是,我需要登录所有视图,其中一些是特定权限.在基于函数的视图中,我使用@permission_required()和视图中的login_required属性执行此操作,但我不知道如何在新视图上执行此操作.django文档中是否有一些部分解释了这一点?我没找到任何东西.我的代码有什么问题?

我尝试使用@method_decorator,但它回复" / errors/prueba/_wrapped_view()中的TypeError至少需要1个参数(0给定) "

这是代码(GPL):

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required

class ViewSpaceIndex(DetailView):

    """
    Show the index page of a space. Get various extra contexts to get the
    information for that space.

    The get_object method searches in the user 'spaces' field if the current
    space is allowed, if not, he is redirected to a 'nor allowed' page. 
    """
    context_object_name = 'get_place'
    template_name = 'spaces/space_index.html'

    @method_decorator(login_required)
    def get_object(self):
        space_name = self.kwargs['space_name']

        for i in self.request.user.profile.spaces.all():
            if i.url …
Run Code Online (Sandbox Code Playgroud)

django django-views django-authentication django-class-based-views class-based-views

151
推荐指数
6
解决办法
8万
查看次数

如何在Django 1.3中使用基于类的视图重定向条件?

我正在使用ListView根据标签列出视频.过滤发生在get_queryset()中.如果标签不包含任何视频,我想将用户重定向到另一个页面.

有了功能,就很容易了.查询,检查查询集,重定向.在课堂上,我没有这样做:

class VideosView(generic.ListView):

    def get_queryset(self):
        """
            This work.
        """

        tag = self.kwargs.get('tag', None)

        self.videos = Video.on_site.all()

        if tag:
            self.videos = Video.tagged.with_all(tag, self.videos)

        return self.videos

    def get(self, request, *args, **kwargs):
        """
        This doesn't work because self.videos doesn't exist yet.
        """
        if not self.videos:
            return redirect('other_page')

        return super(Videos, self).get(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

django redirect class-based-views

28
推荐指数
2
解决办法
2万
查看次数

Django:基于类的ListView中的搜索表单

我试图实现一个Class Based ListView显示选择的表集.如果第一次请求站点,则应显示数据集.我更喜欢POST提交,但GET也没关系.

这是一个容易处理的问题,function based views但是基于类的视图我很难理解.

我的问题是我得到了各种错误,这是由于我对基于分类的观点的理解有限.我已阅读各种文档,我理解直接查询请求的视图,但只要我想在查询语句中添加一个表单,我就遇到了不同的错误.对于下面的代码,我会收到一个ValueError: Cannot use None as a query value.

根据表单条目(否则选择整个数据库),基于类的ListView的最佳实践工作流程是什么?

这是我的示例代码:

models.py

class Profile(models.Model):
    name = models.CharField(_('Name'), max_length=255)

    def __unicode__(self):
        return '%name' % {'name': self.name}

    @staticmethod
    def get_queryset(params):

        date_created = params.get('date_created')
        keyword = params.get('keyword')
        qset = Q(pk__gt = 0)
        if keyword:
            qset &= Q(title__icontains = keyword)
        if date_created:
            qset &= Q(date_created__gte = date_created)
        return qset
Run Code Online (Sandbox Code Playgroud)

forms.py

class ProfileSearchForm(forms.Form):
    name = forms.CharField(required=False)
Run Code Online (Sandbox Code Playgroud)

views.py

class ProfileList(ListView):
    model = Profile
    form_class = …
Run Code Online (Sandbox Code Playgroud)

forms django listview django-class-based-views class-based-views

25
推荐指数
3
解决办法
3万
查看次数

如何在基于类的通用视图中访问RequestContext?

我在urls.py中有这条路径:

archive_index_dict = {
    'queryset': News.objects.filter(show=True),
    'date_field': 'date',
    'template_object_name': 'object_list',
}

...

url(r'^$', 'django.views.generic.date_based.archive_index',
        archive_index_dict, name='news_archive_index'
    ),
Run Code Online (Sandbox Code Playgroud)

现在我想在模板中检测页面是否是最新的(这是用于菜单样式).既不 在模板中工作{{ request.path }}也不{{ request.get_full_path }}工作.

我应该用什么呢?

要获得request模板我不得不添加可django.core.context_processors.requestTEMPLATE_CONTEXT_PROCESSORS.默认情况下不设置此项(因为django 1.3).

django requestcontext django-generic-views class-based-views

17
推荐指数
1
解决办法
4015
查看次数

在基于Django类的视图中检查视图方法参数名称

我在我的Django项目中创建了一个装饰器,用于将参数值注入到装饰方法的参数中.

我这样做是inspect.getargspec为了检查方法中存在哪些参数并将它们放入kwargs.否则,由于方法中的参数数量不正确,我会收到错误.

虽然这在单个视图方法中正常工作,但在Django基于类的视图方面却失败了.

我相信这可能是因为装饰器@method_decorator在类级别应用于dispatch方法而不是个人getpost方法.

我是一个蟒蛇新手,可能会忽略一些明显的东西.

有没有更好的方法来做我正在做的事情?是否可以在基于类的视图中获取方法参数名称?

我正在使用Python 2.7和Django 1.11

装饰者

def need_jwt_verification(decorated_function):
    @wraps(decorated_function)
    def decorator(*args, **kwargs):
        request = args[0]
        if not isinstance(request, HttpRequest):
            raise RuntimeError(
                "This decorator can only work with django view methods accepting a HTTPRequest as the first parameter")

        if AUTHORIZATION_HEADER_NAME not in request.META:
            return HttpResponse("Missing authentication header", status=401)

        jwt_token = request.META[AUTHORIZATION_HEADER_NAME].replace(BEARER_METHOD_TEXT, "")

        try:
            decoded_payload = jwt_service.verify_token(jwt_token)

            parameter_names = inspect.getargspec(decorated_function).args

            if "phone_number" in parameter_names or "phone_number" …
Run Code Online (Sandbox Code Playgroud)

python django django-class-based-views class-based-views

11
推荐指数
2
解决办法
955
查看次数

Django:模型对象"在基于类的视图中没有属性'_meta'"

嗨Stackoverflow人,

我正在使用基于类的视图和测试站点,我按照文档来设置基于类的视图.对于项目站点(基于下面的项目模型),我只想为下面的简单项目模型创建一个快速CRUD应用程序.

models.py

class Project(models.Manager):
    name =  models.CharField(_('Name of the Project'), max_length = 100,)
    slug = models.SlugField(max_length=100,)
    ...
Run Code Online (Sandbox Code Playgroud)

views.py

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from project.models import Project

class ProjectCreate(CreateView):
    model = Project

class ProjectUpdate(UpdateView):
    model = Project
Run Code Online (Sandbox Code Playgroud)

当我现在加载\project\add,应该调用ProjectCreate该类时,我收到以下错误: 类型对象'Project'没有属性'_meta'

我不懂为什么.模型类通常不需要元信息.在其他基于类的项目中,我没有遇到这个问题.

谢谢你的建议!

追溯

Django Version: 1.4.1
Python Version: 2.7.1

Traceback:
File "/Users/neurix/Development/vir_project_2.0/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/neurix/Development/vir_project_2.0/lib/python2.7/site-packages/django/views/generic/base.py" in view
  48.             return self.dispatch(request, *args, **kwargs) …
Run Code Online (Sandbox Code Playgroud)

python django meta django-class-based-views class-based-views

8
推荐指数
1
解决办法
2万
查看次数

Django:没有调用CBV方法form_valid()

在我的CreateView班级中,我将覆盖以下form_valid()函数:

class ActionCreateView(CreateView):
    model = Action
    form_class = ActionCreateForm
    success_url = reverse_lazy('profile')

    def get_initial(self):
        initial = super(ActionCreateView, self).get_initial()
        initial['request'] = self.request
        return initial

    def form_valid(self, form):
        form.instance.user = self.request.user
        print 'user: %s'%form.instance.user
        try:
            da = form.cleaned_data['deadline_date']
            ti = datetime.now()
            form.instance.deadline = datetime(da.year, da.month, da.day, ti.hour, ti.minute, ti.second )
        except Exception:
            raise Http404
        return super(ActionCreateView, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

但事实证明,该form_valid方法永远不会被调用,因为user它永远不会打印出来.有趣的clean是,调用forms.py中的方法.

没有显示错误(因此我没有要显示的回溯).用户只是重新定向到表单. 这种行为可能是什么原因? 我正在使用Django 1.5和Python 2.7.

django validation django-class-based-views class-based-views django-1.5

7
推荐指数
2
解决办法
4988
查看次数

Django:使用post()方法的ListView?

我试图在基于Django类的视图中处理两个表单.该站点包含一个名为form(基于GET)的表单,用于缩小ListView和第二个表单status_form(基于POST)的列表结果.

两个表单都是必需的,因为ListView返回一个项列表.Form让用户限制选择并status_forms让用户通过模态表单标记不正确的项目(因此它需要在同一模板中).

我的麻烦是,ListView方法没有post,但是FormView.我的类List继承自这两个类,但是当我执行该类时,我收到错误消息:

属性错误:'List'对象没有属性'status_form'

我该如何更改我的实现以允许通过post method?处理第二个表单?

class List(PaginationMixin, ListView, FormMixin):
    model = ListModel
    context_object_name = 'list_objects'
    template_name = 'pages/list.html'
    paginate_by = 10 #how may items per page

    def get(self, request, *args, **kwargs):
        self.form = ListSearchForm(self.request.GET or None,)
        return super(List, self).get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.status_form = StatusForm(self.request.POST or None)
        if self.status_form.is_valid():
            ...
        else:
            return super(List, …
Run Code Online (Sandbox Code Playgroud)

python django formview django-class-based-views class-based-views

6
推荐指数
1
解决办法
2万
查看次数

基于类视图的django初始化形式选择

我已经看到很多关于如何在不使用基于类的视图时解决这个问题的答案.是否有一些非常明显的事情我错过了用CBV做的事情?

基本上我想在我的表单中有一个MultipleChoiceField,它的选择取决于视图中发生的事情.例如,我使用URL中的PK来执行一些后端请求,然后应该使用这些请求来填充选项.

# forms.py
from django.forms import Form, MultipleChoiceField, CharField

class EmailForm(Form):

    users = MultipleChoiceField(required=False)
    subject = CharField(max_length=100)
    message = CharField()

    def __init__(self, users=None, *args, **kwargs):
        super(EmailForm, self).__init__(*args, **kwargs)
        if users:
            self.fields['users'].choices = users

#urls.py
from django.conf.urls import url, patterns
from .views import EmailView

# url patterns
urlpatterns = patterns('',
    url( r'^(?P<pk>\d+)$', EmailView.as_view(), name="maindex" ),
)

#views.py
from django.views.generic import FormView, TemplateView
from .forms import EmailForm

class EmailView(FormView):
    template_name = 'myapp/email.html'
    form_class = EmailForm
    success_ulr = '/thanks/'

    def form_valid(self, form): …
Run Code Online (Sandbox Code Playgroud)

forms django class-based-views

6
推荐指数
1
解决办法
4511
查看次数

Flask中基于类的(通用)视图

使用Flask Web框架编写通用视图的最佳方法是什么?

@ app.route装饰器是否支持可调用类?或者我是以完全错误的方式思考这个问题?

任何帮助或建议将不胜感激!

python web-frameworks flask class-based-views

5
推荐指数
1
解决办法
2017
查看次数