假设我有两个模型,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) 在定义 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) 我正在尝试编写一个测试来验证从基于类的通用视图返回的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) 我有一个模型,我想显示为详细信息视图,我创建了一个列表视图,其中包含一个链接,可以显示其详细视图.我没有得到任何错误,但模板没有呈现任何模型细节链接到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
现在我有一个基于类的视图.我想在这个视图中设置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) 我有 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)
使用基于类的视图有什么干净的方法可以做到这一点吗?或者只是将帖子显示代码与评论处理代码分离的某种方法?
我的 Django 项目中有以下 urls 配置:
urlpatterns = patterns('',
(r'^my-view$', MyViewClass.as_view()),
)
Run Code Online (Sandbox Code Playgroud)
有没有办法使用该reverse()函数来获取上述视图的url?
在对django createview上接受的答案的评论如何获取创建的对象之后,我试图使用CreateView其get_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) 我正在尝试使用最常见/标准/推荐的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
我正在{{ 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使得所有我需要做的就是传递一个变量,它会给我一个上下文只是为标题,而不是写出来的代码块的每一个观点?