标签: django-class-based-views

使用DeleteObject通用视图删除对象后重定向到父级

假设我有两个模型,Book和Page:

class Book(models.Model):
    pass

class Page(models.Model):
    book = models.ForeignKey(Book)
Run Code Online (Sandbox Code Playgroud)

我需要删除一个页面并重定向到该页面所属的特定书籍.为此,我创建了一个基于类的视图来删除页面:

class PageDeleteView(DeleteView):
    model = Page

    def get_success_url(self, **kwargs):
        return reverse_lazy('book_detail', self.book.pk)
Run Code Online (Sandbox Code Playgroud)

问题是,由于在调用get_success_url之前删除了对象,因此该方法失败,并且出现404错误.

我怎么能这样做?

更新:

按照@DrTyrsa的想法,我已经实现了覆盖delete方法,所以类如下:

reverse_lazy = lambda name=None, *args : lazy(reverse, str)(name, args=args)

class PageDeleteView(DeleteView):
    model = Page

    def get_success_url(self, **kwargs):
        return reverse_lazy('book_detail', self.book.pk)

    def delete(self, request, *args, **kwargs):
        self.book_pk = self.get_object().book.pk
        return super(PageDeleteView, self).delete(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

django django-views django-class-based-views

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

如何使用当前登录用户作为 Django DetailView 的 PK?

在定义 URL 模式时,我应该使用正则表达式从 URL 获取 PK。

如果我想要一个没有PK的URL,如果没有提供,它将使用当前登录的用户怎么办?例子:

  • 访问/user将获得当前登录用户的 DetailView
  • /user/edit 将显示当前登录用户的 UpdateView

我尝试pk=Detail.as_view()调用中对 the进行硬编码,但它报告无效的关键字。

如何在 URL conf 中指定?

我的示例代码显示访问/userURL时需要 PK 错误:

urlpatterns = patterns('',
    url(r'user/$', 
        DetailView.as_view(
            model=Account,
            template_name='user/detail.html')),
)`
Run Code Online (Sandbox Code Playgroud)

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

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

从基于类的通用视图手动获取响应

我正在尝试编写一个测试来验证从基于类的通用视图返回的HTML.假设我有这个基于函数的视图,只需渲染一个模板:

# views.py
from django.shortcuts import render

def simple_view(request, template='template.html'):
    return render(request, template)
Run Code Online (Sandbox Code Playgroud)

有了它,在测试期间我可以这样做:

# tests.py
from django.http import HttpRequest
from .views import simple_view

request = HttpRequest()
response = simple_view(request)
Run Code Online (Sandbox Code Playgroud)

然后对其进行验证response.现在我想将上面的内容转换为继承自TemplateView的基于类的视图:

# views.py
from django.views.generic import TemplateView

class SimpleView(TemplateView):
    template_name = 'template.html'
Run Code Online (Sandbox Code Playgroud)

现在基本相同的测试方法失败了:

# tests.py
from django.http import HttpRequest
from .views import SimpleView

request = HttpRequest()
view_func = SimpleView.as_view()
response = view_func(request).render()
Run Code Online (Sandbox Code Playgroud)

结果是

Traceback (most recent call last):
    File "tests.py", line 30, in test_home_page_returns_correct_html
response = view_func(request).render()
    File …
Run Code Online (Sandbox Code Playgroud)

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

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

DetailView模板不显示模型数据

我有一个模型,我想显示为详细信息视图,我创建了一个列表视图,其中包含一个链接,可以显示其详细视图.我没有得到任何错误,但模板没有呈现任何模型细节链接到DetailView

<a href="../ancillaries/{{ Ancillary.id }}" > Product </a>
Run Code Online (Sandbox Code Playgroud)

模型

from django.db import models
from django.core.urlresolvers import reverse

class Ancillary(models.Model):
     product_code = models.CharField(max_length=60, null=True)
     type = models.CharField(max_length=120, null=True)
     product = models.CharField(max_length=120, null=True)
     standard = models.CharField(max_length=120,   null=True)
     measurement = models.CharField(max_length=120,  null=True)
     brand = models.CharField(max_length=120,   null=True)

     class Meta:
          verbose_name_plural = "Ancillaries"
     def get_absolute_url(self):
          return reverse('ancillaries')
     def __unicode__(self):
          return u'%s %s %s %s %s %s  %s' % (self.id, self.product_code, self.type, 
                                self.product, self.standard, 
                                self.measurement, self.brand)
Run Code Online (Sandbox Code Playgroud)

视图

class AncillaryDetail(DetailView):
    model = Ancillary
    def get_context_data(self, **kwargs):

        context …
Run Code Online (Sandbox Code Playgroud)

django django-templates django-views django-class-based-views

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

django如何在基于类的视图中获取响应

现在我有一个基于类的视图.我想在这个视图中设置cookie,但是我可以得到响应,但是响应是在get methond中返回的.所以我无法将cookie设置为response.so如何在基于类的视图中获取响应

 class MyView(TemplateView):
    def get_context_data(self, **kwargs):
        context = super(UBaseTemplateView, self).get_context_data(**kwargs)

        #in here set cookie,but can get the response 
        #response.set_cookie("success","success")

        return context
Run Code Online (Sandbox Code Playgroud)

django cookies django-class-based-views

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

在 Django 1.6 中结合 DetailView 和 CreateView

我有 2 个独立的模型,发布和评论。我使用 DetailView 来显示 Post 内容,我想使用 CreateView 在同一页面上显示评论创建表单。最干净的方法是什么?

唯一想到的是使用自定义视图,它既获取对象又处理评论表单,但这看起来太脏了:

def post_detail(request, slug):
    post = get_object_or_404(Post, slug=slug)
    if request.POST:
        form = CommentForm(request.POST)
        # do comment form processing here
    return render(request, "post/post_detail.html", {
        "object": post, "comment_form": form})
Run Code Online (Sandbox Code Playgroud)

使用基于类的视图有什么干净的方法可以做到这一点吗?或者只是将帖子显示代码与评论处理代码分离的某种方法?

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

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

Django - 在基于类的视图上使用 reverse()

我的 Django 项目中有以下 urls 配置:

urlpatterns = patterns('',
    (r'^my-view$', MyViewClass.as_view()),
)
Run Code Online (Sandbox Code Playgroud)

有没有办法使用该reverse()函数来获取上述视图的url?

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

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

为什么CreateView中的self.object在保存到数据库后没有id?

在对django createview上接受的答案的评论如何获取创建的对象之后,我试图使用CreateViewget_success_url方法中由a创建的用户的id .但是,即使它确实被保存到MySQL并且接收到id,但是当我访问self.object它时,它没有要使用的id.该模型确实有一个id属性.为什么我无法访问ID?如果我被链接评论误导,获得身份证的正确方法是什么?

参考代码:

models.py

from django.db import models

class User(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=128)
    active = models.BooleanField(blank=True)
    created_date = models.DateTimeField()
    class Meta:
        managed = False
        db_table = 'user'
    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

views.py

from django.views.generic import CreateView
from django.core.urlresolvers import reverse
from forms import AddUserForm

class AddUserView(CreateView):
    form_class = AddUserForm
    fields = ['name', 'active'] # id and created_date are auto-filled upon save
    template_name = 'webApp/add_user_form.html' …
Run Code Online (Sandbox Code Playgroud)

python mysql django django-class-based-views

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

如何使用Django通用视图过滤表?

我正在尝试使用最常见/标准/推荐的Django 1.6方法创建具有分页,排序和过滤的表视图.这似乎是基于通用类的视图和django-tables2.我找到了至少两个不同的如何添加过滤的例子,一个用django-filters和crispy-forms,另一个用django_filters,但都没有包含完整的工作示例.当我遵循任何一种方法时,我都会陷入困境中.使用Nicolas Kuttler的脆弱方法,我有:

models.py

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

tables.py

import django_tables2 as dt2
from .models import Author

class AuthorTable(dt2.Table):
    class Meta:
        model = Author
Run Code Online (Sandbox Code Playgroud)

如果我理解正确的话,PagedFilteredTableView是一个泛型类,然后我继承AuthorView,而不是另一个例子,其中FilteredSingleTableView,我认为应该被理解为类似,如果Author是表,AuthorFilteredSingleTableView.

views.py

from .tables import AuthorTable
from .models import Author
from django_tables2 import SingleTableView

class PagedFilteredTableView(SingleTableView):
    """
    Generic class from http://kuttler.eu/post/using-django-tables2-filters-crispy-forms-together/
    which should probably be in a utility file
    """
    filter_class = None
    formhelper_class = None
    context_filter_name = 'filter'

    def get_queryset(self, **kwargs):
        qs = super(PagedFilteredTableView, self).get_queryset()
        self.filter …
Run Code Online (Sandbox Code Playgroud)

django django-filter django-class-based-views django-tables2

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

Django CBV - 如何避免为每个视图重复 get_context_data 只是为了获得自定义标题?

我正在{{ title }}为我的项目的每一页设置一个。有时这title是一个静态字符串,例如Enter your Name,有时它基于该页面上的相关对象,例如Employee.first_name.

为了创建context['title'],我get_context_data在每个基于类的视图中使用。但这似乎导致我每次都重复一段代码,我希望以某种方式减少它。

例如,要为每个页面编写自定义标题,我必须这样写:

def get_context_data(self, **kwargs):
    context = super(SomeView, self).get_context_data(**kwargs)
    context['title'] = 'Title for This page'
    return context
Run Code Online (Sandbox Code Playgroud)

我觉得有一个混入是理想的,我以某种方式只是传入变量title,我的context字典将context['title']根据传入的变量自动添加。

这可能吗?有没有一种方法来创建一个mixin使得所有我需要做的就是传递一个变量,它会给我一个上下文只是为标题,而不是写出来的代码块的每一个观点?

python django django-class-based-views

5
推荐指数
2
解决办法
636
查看次数