标签: django-generic-views

Django基于类的视图:如何将其他参数传递给as_view方法?

我有一个基于类的自定义视图

# myapp/views.py
from django.views.generic import *

class MyView(DetailView):
    template_name = 'detail.html'
    model = MyModel

    def get_object(self, queryset=None):
        return queryset.get(slug=self.slug)
Run Code Online (Sandbox Code Playgroud)

我想像这样传入slug参数(或其他参数到视图)

MyView.as_view(slug='hello_world')
Run Code Online (Sandbox Code Playgroud)

我是否需要覆盖任何方法才能执行此操作?

python django django-views django-generic-views

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

使用get_queryset()方法或设置queryset变量?

这两段代码在第一时间是相同的:

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'
    queryset = Poll.active.order_by('-pub_date')[:5]
Run Code Online (Sandbox Code Playgroud)

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'

    def get_queryset(self):
        return Poll.active.order_by('-pub_date')[:5]
Run Code Online (Sandbox Code Playgroud)

它们之间有什么区别吗?如果它是:

什么方法更好?或者当设置queryset变量优于覆盖get_queryset方法时?反之亦然.

django django-views django-generic-views

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

在基于类的通用视图CreateView中访问request.user,以便在Django中设置FK字段

所以我的模型包括:

class Place(models.Model):
    ....
    created_by = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

我的观点是这样的:

class PlaceFormView(CreateView):
    form_class = PlaceForm

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PlaceFormView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

有没有办法让我访问request.user并将created_by设置为该用户?我查看了文档,但似乎无法找到任何暗示.

`

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

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

手动调用基于类的通用视图

我正在尝试从另一个基于类的通用视图中调用基于类的通用视图,并且似乎无法正确执行.

我试过的方法:

result = CategoryTypes.as_view()  # The same way you put it in the urlconf
print result
Run Code Online (Sandbox Code Playgroud)

打印: <function CategoryTypes at 0x92bd924>

CategoryTypes.as_view()(self.request)
# &
CategoryTypes().dispatch(self.request)
Run Code Online (Sandbox Code Playgroud)

回溯:

ContentNotRenderedError at /crm/categories/company/ The response content must be rendered before it can be accessed.

result = CategoryTypes().__init__()
print result
Run Code Online (Sandbox Code Playgroud)

打印: None

我如何从另一个视图中调用它?我认真地尝试了课堂上的每一种方法以及我能想到的调用它的方法.

python django django-generic-views

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

在Django中的AJAX发布后重定向

我使用Django的内置DeleteView,并为success_url属性分配了一个值.现在在我的模板中,我通过JQuery'$ .post()方法触发此视图.当项目被删除时,我不会被重定向到success_url.经过一些搜索,我发现它似乎是AJAX post方法的一个问题,它忽略了重定向.

我通过添加一个函数来修复它,将其设置window.location="#myRedirectionURL"$.post()JQuery中的第三个参数.

但是,这种方式似乎不是很Django.从本质上讲,它解决了AJAX方面的问题,而不是Django.更重要的是,它使success_urlDeleteView无用(但你还是要分配一个值success_url,否则Django会引发一个错误).

当你通过AJAX发布时,它是正确的重定向方式吗?有没有更好的方法呢?

非常感谢.

django ajax jquery redirect django-generic-views

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

用简单的英语,什么是Django通用视图?

本页的前两段解释了通用视图应该让我的生活更轻松,更少单调,让我对女性更具吸引力(我构成了最后一个):

https://docs.djangoproject.com/en/1.4/topics/generic-views/

我都是为了改善我的生活,但通用观点实际上做了什么?似乎有很多流行语被抛出,这比他们解释的更令人困惑.

通用视图类似于Ruby on Rails中的scaffolding吗?介绍中的最后一个要点似乎表明了这一点.这是一个准确的陈述吗?

python django django-generic-views

20
推荐指数
2
解决办法
6259
查看次数

对FormView中的get_form_kwargs感到好奇

我最近遇到了FormView的问题,并发现使用get_form_kwargs的方法就是这样做.

这是我的代码:

class InternalResetPasswordView(FormView):

template_name = 'reset_password.html'
form_class = forms.InternalPasswordResetForm

# success_message = "Password was reset successfully"

# To get request object
# http://notesondjango.wordpress.com/2012/12/18/modelform-formview-and-the-request-object/
# https://stackoverflow.com/questions/13383381/show-message-after-password-change
# http://pydanny.com/simple-django-email-form-using-cbv.html
# http://bubuzzz.wordpress.com/2012/05/01/class-based-generic-views-in-django-a-simple-sample/
def get_form_kwargs(self):
    kwargs = super(InternalResetPasswordView, self).get_form_kwargs()
    kwargs['user'] = self.request.user
    return kwargs

def get_success_url(self):
    return reverse('user-detail', kwargs={'pk': self.request.user.id})

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
    return super(InternalResetPasswordView, self).dispatch(*args, **kwargs)   

'''
def get_context_data(self, **kwargs):

    context = super(InternalResetPasswordView, self).get_context_data(**kwargs)
    context['InternalPasswordResetForm'] = context.get('form')

    return context


def get_form_kwargs(self):
    kwargs = super(InternalResetPasswordView, self).get_form_kwargs()
    kwargs['request'] = self.request
    return kwargs …
Run Code Online (Sandbox Code Playgroud)

django formview django-views django-generic-views

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

使用名为"pk"的URL关键字参数调用的预期视图

我正在密切关注测试文档,为Django Rest Framework视图编写测试

这是我的简单测试:

def test_patient_detail_api_opens(self):
    factory = APIRequestFactory()
    view =PatientDetailApi.as_view()
    request = factory.get(reverse('api_pacjent', kwargs={'pk' :1}))
    force_authenticate(request, user=self.user)
    response = view(request)
    self.assertEqual(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)

此测试失败,并显示以下消息:

AssertionError: Expected view PatientDetailApi to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会发生这种情况以及如何解决这个问题.

  • pkkwargs是存在的URL,
  • 根据文档,lookup-field如果默认值pk,则无需显式添加值,
  • 视图打开正确,但此测试失败...

有人可以解释为什么会出现这种错误吗?

这是相关的代码:

'主' url.py:

urlpatterns = [
    url(r'^pacjent/', include('pacjent.urls')),
] 
Run Code Online (Sandbox Code Playgroud)

pacjent.urls 看起来像这样:

url(r'^api/szczegoly/(?P<pk>\d+)/$', PatientDetailApi.as_view(), name="api_pacjent"), …
Run Code Online (Sandbox Code Playgroud)

python testing django django-generic-views django-rest-framework

18
推荐指数
2
解决办法
9357
查看次数

Python多重继承函数覆盖和django中的ListView

我创建了一个子类ListView和两个已实现get_context_data函数的自定义mixin的类.我想在子类上覆盖此函数:

from django.views.generic import ListView

class ListSortedMixin(object):
    def get_context_data(self, **kwargs):
        print 'ListSortedMixin'
        return kwargs

class ListPaginatedMixin(object):
    def get_context_data(self, **kwargs):
        print 'ListPaginatedMixin'
        return kwargs

class MyListView(ListSortedMixin, ListPaginatedMixin, ListView):
  def get_context_data(self, **context):
    super(ListSortedMixin,self).get_context_data(**context)
    super(ListPaginatedMixin,self).get_context_data(**context)
    return context
Run Code Online (Sandbox Code Playgroud)

当我执行MyListView它时只打印"ListSortedMixin".出于某种原因,python正在执行ListSortedMixin.get_context_data而不是代替MyListView.get_context_data.为什么?

如果我将继承顺序更改为ListPaginatedMixin, ListSortedMixin, ListView,ListPaginatedMixin.get_context_data则执行.

我该如何覆盖该get_context_data功能?

python django listview multiple-inheritance django-generic-views

17
推荐指数
2
解决办法
9925
查看次数

如何在基于类的通用视图中访问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
查看次数