我正在尝试做这样的事情:
class AboutView(TemplateView):
template_name = 'about.html'
def get_context_data(self, **kwargs):
context = super(AboutView, self).get_context_data(**kwargs)
context['dahl_books'] = Books.objects.filter(author="Dahl')
Run Code Online (Sandbox Code Playgroud)
当我尝试在我的模板中访问dahl_books时,如下所示:
{% for book in dahl_books %}
Run Code Online (Sandbox Code Playgroud)
dahl_books在模板上下文中不可用,即使Books QuerySet返回非零数量的书籍.....我在模板中还是在做错了get_context_data?
django django-templates django-views django-class-based-views
我有两个连接的形式.基本上用户填写第一种形式,然后重定向到第二种形式,这增加了第一种形式的数据的价值.EG我有一个表单电影(第一个表单)然后我被重定向到表单(演员),它将演员添加到电影中.
在我的情况下,电影= Chiamata和演员= Offerta(我保留意大利人的名字,我需要:D)
精细.
这些是我在urls.py中的网址
url(r'^chiamata/$', ChiamataCreate.as_view(),name='chiamata_create'),
url(r'^chimamata/(?P<pk>\d+)/offerta$', OffertaCreate.as_view(), name='offerta_create'),
Run Code Online (Sandbox Code Playgroud)
我创建了这个视图
class ChiamataCreate(CreateView):
template_name = 'chiamata_form.html'
form_class = ChiamataForm
success_url=reverse_lazy('offerta_create',args=(??,))
Run Code Online (Sandbox Code Playgroud)
现在问题是如何获得chiamataForm创建的对象的PK.我需要将它添加到offerta_create的url中.
我试图学习基于类的视图,对于细节或列表视图并不复杂.
我有一个搜索表单,我只想查看是否发送查询以显示结果.
这是功能代码(不是我的,来自django书):
def search_page(request):
form = SearchForm()
bookmarks = []
show_results = False
if 'query' in request.GET:
show_results = True
query = request.GET['query'].strip()
if query:
form = SearchForm({'query': query})
bookmarks = Bookmark.objects.filter(title__icontains=query)[:10]
show_tags = True
show_user = True
if request.is_ajax():
return render_to_response("bookmarks/bookmark_list.html", locals(), context_instance=RequestContext(request))
else:
return render_to_response("search/search.html", locals(), context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
忽略ajax事实(现在只是为了使问题更容易),我如何将其转换为基于类的视图?
我快速尝试过这样的事情:
class SearchPageView(FormView):
template_name = 'search/search.html'
def get(self, request, *args, **kwargs):
form = SearchForm()
self.bookmarks = []
self.show_results = False
if 'query' in self.request.GET:
self.show_results = True
query = …Run Code Online (Sandbox Code Playgroud) 如何success_url根据参数进行设置?
我真的想回到我来自哪里,而不是一些静态的地方.在伪代码中:
url(r'^entry/(?P<pk>\d+)/edit/(?P<category>\d+)',
UpdateView.as_view(model=Entry,
template_name='generic_form_popup.html',
success_url='/category/%(category)')),
Run Code Online (Sandbox Code Playgroud)
这意味着:编辑条目pk然后返回"类别".这里的条目可以是多个类别的一部分.
Request Method: GET
Request URL: http://localhost:8080/user/create
Django Version: 1.5.1
Exception Type: TypeError
Exception Value: ____init____() got an unexpected keyword argument 'instance'
Exception Location: /place/venv/local/lib/python2.7/site-packages/django/views/generic/edit.py in get_form, line 35
Python Executable: /place/venv/bin/python
Python Version: 2.7.3
Run Code Online (Sandbox Code Playgroud)
class UserCreateView(CreateView):
model = models.User
form_class = forms.UserForm
Run Code Online (Sandbox Code Playgroud)
url(r'^user/create$', UserCreateView.as_view(), name='user_create'),
Run Code Online (Sandbox Code Playgroud)
class UserForm(forms.Form):
GROUP_CHOICES = [(-1, '[Choose]')]
GROUP_CHOICES += [(group.id, group.name.capitalize()) for group in auth.models.Group.objects.all()]
email = forms.EmailField(
label='Email',
widget=forms.TextInput(attrs={'placeholder': 'Email'})
)
first_name = forms.CharField(
label='First Name',
widget=forms.TextInput(attrs={'placeholder': 'First Name'})
)
last_name …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用基于类的UpdateView更新Django User模型,该模型会自动呈现给当前用户,但是我遇到了需要pk或slug的错误.表单工作并使用适当的当前用户上下文呈现,但在我尝试提交更改时会抛出错误.以下是我使用的视图:
class UserUpdateView(UpdateView):
form_class = UserForm
model = User
template_name = 'members/user_update.html'
def get(self, request, **kwargs):
self.object = User.objects.get(username=self.request.user)
form_class = self.get_form_class()
form = self.get_form(form_class)
context = self.get_context_data(object=self.object, form=form)
return self.render_to_response(context)
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
return HttpResponseRedirect(self.get_success_url())
Run Code Online (Sandbox Code Playgroud) 所以我的模型包括:
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的基于类的视图(CBV).
class BlahView(TemplateView):
template_name = 'blah/blah.html'
def get_context_data(self, **kwargs):
#code...
def get(self, request, **kwargs):
#more code...
Run Code Online (Sandbox Code Playgroud)
现在,我知道我可以从self.request获得请求参数.现在说我要解析这些请求参数并将它们存储在类中.我可以存放self.xxx吗?现在,显然基于类的工作方式,这看起来很简单.
但我无法弄清楚控制的流程,看看View(超类TemplateView)的定义.该源提到as_view()是"入口点"
我想在开头设置我的实例变量get_context_data()但是在那里进行初始化似乎不对.
我可以__init__()为我的CBV 定义一个吗?如果是这样,是否存在线程问题或多个页面访问可能与我的解析数据的全局实例一起工作?
我知道这听起来有点混乱,但我只是对CBV中的代码流感到困惑.
我正在尝试使用基于类的视图(TemplateView)执行cache_page,但我无法做到.我按照这里的说明:
以及这里:
https://github.com/msgre/hazard/blob/master/hazard/urls.py
但我得到这个错误:
cache_page has a single mandatory positional argument: timeout
Run Code Online (Sandbox Code Playgroud)
我读了cache_page的代码,它有以下内容:
if len(args) != 1 or callable(args[0]):
raise TypeError("cache_page has a single mandatory positional argument: timeout")
cache_timeout = args[0]
Run Code Online (Sandbox Code Playgroud)
这意味着它不会允许超过1个参数.有没有其他方法让cache_page工作?我一直在挖这个...
似乎以前的解决方案不再适用
假设我想创建一个基于类的视图,它既可以更新也可以创建一个对象.根据我之前提出的问题,我可以做以下事情之一:
1)使用2周通用的观点CreateView和UpdateView我认为将意味着有两个网址指向两个不同的类.
2)使用继承base的基于类的视图View,我认为这意味着有两个URL指向只有1个类(我创建了哪个继承View).
我有两个问题:
a)哪个更好?
b)ccbv.co.uk显示了一个基础View,但我没有看到记录的任何get,post等方法,这是正确的吗?