我在理解新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
我正在使用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) 我试图实现一个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
我在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.request到TEMPLATE_CONTEXT_PROCESSORS.默认情况下不设置此项(因为django 1.3).
django requestcontext django-generic-views class-based-views
我在我的Django项目中创建了一个装饰器,用于将参数值注入到装饰方法的参数中.
我这样做是inspect.getargspec为了检查方法中存在哪些参数并将它们放入kwargs.否则,由于方法中的参数数量不正确,我会收到错误.
虽然这在单个视图方法中正常工作,但在Django基于类的视图方面却失败了.
我相信这可能是因为装饰器@method_decorator在类级别应用于dispatch方法而不是个人get和post方法.
我是一个蟒蛇新手,可能会忽略一些明显的东西.
有没有更好的方法来做我正在做的事情?是否可以在基于类的视图中获取方法参数名称?
我正在使用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) 嗨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
在我的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
我试图在基于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
我已经看到很多关于如何在不使用基于类的视图时解决这个问题的答案.是否有一些非常明显的事情我错过了用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) 使用Flask Web框架编写通用视图的最佳方法是什么?
@ app.route装饰器是否支持可调用类?或者我是以完全错误的方式思考这个问题?
任何帮助或建议将不胜感激!
django ×9
python ×4
forms ×2
django-1.5 ×1
django-views ×1
flask ×1
formview ×1
listview ×1
meta ×1
redirect ×1
validation ×1