标签: django-class-based-views

用于创建或更新的Django类基础通用视图

我已经知道如何使用基于类的通用视图之一CreateView,UpdateView和FormView,但我无法弄清楚如何编写干净的东西以创建或更新对象.有人可以帮助我继承其中一个视图和mixins吗?谢谢

django django-views django-class-based-views

7
推荐指数
0
解决办法
940
查看次数

Django:基于参数类的视图

我试图使用通用的CreateView类来处理从同一基类继承的一组模型的表单.

class BaseContent(models.Model):
    ...

class XContent(BaseContent):
    ...

class YContent(BaseContent):
    ...
Run Code Online (Sandbox Code Playgroud)

为了保持DRY,我想定义一个CreateView类,它将处理来自BaseContent的所有继承类.

该视图的url模式为:

url(r'^content/add/(?P<model_name>\w+)/$', ContentCreateView.as_view(), name='content_add')
Run Code Online (Sandbox Code Playgroud)

这样的事情应该有效:

class ContentCreateView(CreateView):
    template_name = 'content_form.html'

    def get_model(self, request):
        # 'content' is the name of the application; model_name is 'xcontent', 'ycontent', ...
        return ContentType.objects.get_by_natural_key('content', self.model_name)
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个例外:

ContentCreateView is missing a queryset. Define ContentCreateView.model, ContentCreateView.queryset, or override ContentCreateView.get_object().
Run Code Online (Sandbox Code Playgroud)

这个建议似乎并不成立,因为我不愿意设置类属性,model或者queryset保持模型表单生成动态.覆盖get_object它似乎与创建对象无关.

我试过覆盖get_queryset()但是这个方法不接受request参数,也没有self.model_name来自url模式的访问权限.

长话短说,如何让CreateView使用基于从url传递的参数的动态表单?

谢谢.

django django-views django-class-based-views

7
推荐指数
1
解决办法
3023
查看次数

Django基于类的通用视图和认证

我是Django的新手(从1.3开始).在构建应用程序时,我从第一天开始使用新的基于类的通用视图,使用内置类的组合并将它们子类化为我需要添加到上下文的位置.

现在我的问题是,我需要回到我的观点,并且只有登录用户才能访问它们.我找到的所有文档都显示了如何使用旧的功能通用视图执行此操作,而不是基于类.

这是一个示例类:

class ListDetailView(DetailView):
    context_object_name = "list"

    def get_queryset(self):
        list = get_object_or_404(List, id__iexact=self.kwargs['pk'])
        return List.objects.all()

    def get_context_data(self, **kwargs):
        context = super(ListDetailView, self).get_context_data(**kwargs)
        context['subscriber_list'] = Subscriber.objects.filter(lists=self.kwargs['pk'])
        return context
Run Code Online (Sandbox Code Playgroud)

如何为django的基于类的新视图添加身份验证?

django django-class-based-views django-1.3

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

Django基于类的通用视图和模型形式

像Django中关于通用视图的大量文档一样,我找不到明确描述如何使用Django Forms的新的基于类的通用视图的文档.

怎么做?

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

7
推荐指数
1
解决办法
2627
查看次数

按功能名称的Django基于反向类的视图不起作用

根据django文档,viewname是函数名称或url模式名称.但是反转这个'反向(MyView.as_view())'的网址会变成NoReverseMatch异常.有没有办法按功能名称反转基于类的视图?

django django-class-based-views

7
推荐指数
1
解决办法
3685
查看次数

如何在单个基于类的视图中修饰不同的http方法

例如,我有一个基于类的视图,它允许GET和POST方法,如下所示,

class ViewOne(View):
    def post(self, request, *args, **kwargs):
        ...
    def get(self, request, *args, **kwargs):
        ...
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ViewOne, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

现在,GET和POST都是login_required.但是,如果我只想要POST为login_required怎么办?

django django-class-based-views

7
推荐指数
1
解决办法
258
查看次数

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 CreateView给出了一个错误"需要有一个字段值"......"才能使用这种多对多关系."

我正在练习Django的FormViews.

在这个应用程序中,我正在创建一个创建博客帖子的PostCreate视图.

这是我的代码:

models.py

class Post(models.Model):
    user = models.ForeignKey(User)
    post_title = models.CharField(max_length=200)
    post_content = models.CharField(max_length=500)

class Tag(models.Model):
    name = models.CharField(max_length=64, unique=True)
    posts = models.ManyToManyField(Post)
Run Code Online (Sandbox Code Playgroud)

forms.py

class PostForm(forms.ModelForm):
    post_title = forms.CharField(
        label=u'Title',
        widget=forms.TextInput(attrs={'size':64})
    )
    post_content = forms.CharField(
        label=u'Content',
        widget=forms.TextInput(attrs={'size':128})
    )
    tags = forms.CharField(
        label=u'Tags',
        required=True,
        widget=forms.TextInput(attrs={'size':64})
    )
    class Meta:
        model = Post
        exclude = ('user', 'post_date')
Run Code Online (Sandbox Code Playgroud)

views.py

class PostCreate(CreateView):
    template_name = 'app_blog/post_save_form.html'
    model = Post
    form_class = PostForm

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user

        tag_names = form.cleaned_data['tags'].split()
        for …
Run Code Online (Sandbox Code Playgroud)

python django django-class-based-views

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

Django中的TemplateView具有自定义状态代码

我的项目中有内部帐户隐私权限(例如,只有朋友可以看到用户的个人资料页面),我希望在这种情况下拥有自定义权限被拒绝页面.有没有办法从TemplateView返回状态代码等于403的响应?

像这样的东西:

class PrivacyDeniedView(TempateView):
    template_name = '...'
    status_code = 403
Run Code Online (Sandbox Code Playgroud)

我可以通过覆盖dispatch()来做到这一点,但也许Django有开箱即用的解决方案

答:看起来没有通用的解决方案.最好的方法是由@alecxe提出,但是在@FoxMaSk建议中封装在Mixin中

django django-class-based-views

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

访问Django中间件中的当前视图类实例

题:

我正在尝试访问中间件层中的视图实例的属性.

例如,给定一个基于类的视图,如下所示:

# views.py
class MyView(View):
    my_attribute = 'something'
Run Code Online (Sandbox Code Playgroud)

我希望能够my_attribute通过这样的方式处理中间件:

# middleware.py
def process_view(self, request, view_func, view_args, view_kwargs):
    my_attribute = request.view.my_attribute
Run Code Online (Sandbox Code Playgroud)

当然,这不起作用,因为Django不会通过请求对象公开视图实例.有没有办法实现这一目标?

谢谢!


我的第一次尝试:

我最初认为该process_view()方法可能是一个很好的地方.不幸的是,view_func它接收的参数包含一个函数 - 输出MyView.as_view()- 而不是视图实例本身.来自Django文档:

process_view(self,request,view_func,view_args,view_kwargs)

... view_func是Django即将使用的Python函数.(它是实际的函数对象,而不是函数的名称作为字符串.)...


我的第二次尝试:

process_template_response()方法中提供了视图实例的句柄,但它非常笨拙,而且,无论如何,我希望能够my_attribute在中间件堆栈的早期阶段使用它.但这确实有效:

def process_template_response(self, request, response):
    my_attribute = response.context_data['view'].my_attribute
Run Code Online (Sandbox Code Playgroud)

django django-middleware django-class-based-views

7
推荐指数
1
解决办法
2667
查看次数