我是django的新手(1.2.4).我用通用视图创建了一些crud.但是,当使用django的消息传递框架创建学生时,如何显示"学生成功添加"之类的内容?
我在博客应用程序中使用Django基于类的通用视图.我的一个视图显示了具有特定标记的帖子列表.我可以将此视图写ListView为帖子,按标签过滤.或者我可以将此视图编写为DetailView标记,并将相关帖子添加到上下文中.
一种方式比其他方式更合适 - 或Pythonic?
这种ListView方法似乎更具语义性,因为我想要的是一个帖子列表,但它也稍微复杂一些.它要求我覆盖两种方法.这种DetailView方法只需要我覆盖一种方法.
class PostTagView(ListView):
"""Display all blog posts with a given tag."""
queryset = Post.objects.published()
def get_context_data(self, **kwargs):
context = super(PostTagView, self).get_context_data(**kwargs)
context['tag'] = get_object_or_404(Tag, slug=self.kwargs['slug'])
return context
def get_queryset(self, **kwargs):
queryset = super(PostTagView, self).get_queryset()
return queryset.filter(tags__slug=self.kwargs['slug'])
class TagDetailView(DetailView):
"""Display all blog posts with a given tag."""
model = Tag
def get_context_data(self, **kwargs):
context = super(TagDetailView, self).get_context_data(**kwargs)
context['object_list'] = Post.objects.published().filter(tags__slug=self.kwargs['slug'])
return context
Run Code Online (Sandbox Code Playgroud) 我经常看到自己必须在我的许多视图的上下文中添加相同的额外变量.
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(MyListView, self).get_context_data(**kwargs)
# Add in the house
context['house'] = self.get_object().house
return context
Run Code Online (Sandbox Code Playgroud)
因为我不喜欢重复自己,我想我可以创建一个扩展视图的新类,然后我可以将所有视图基于新的扩展视图类.问题是,我使用了4类视图:CreateView,UpdateView,ListView和DeleteView.我是否真的必须为其中一个创建一个新类?
是不是像django"基础"视图类?也许更聪明的方法呢?提前谢谢了!
我正处于本教程的最后一部分.
from django.conf.urls import patterns, include, url
from django.views.generic import DetailView, ListView
from polls.models import Poll
urlpatterns = patterns('',
url(r'^$',
ListView.as_view(
queryset=Poll.objects.order_by('-pub_date')[:5],
context_object_name='latest_poll_list',
template_name='polls/index.html')),
url(r'^(?P<pk>\d+)/$',
DetailView.as_view(
model=Poll,
template_name='polls/detail.html')),
url(r'^(?P<pk>\d+)/results/$',
DetailView.as_view(
model=Poll,
template_name='polls/results.html'),
name='poll_results'),
url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
)
Run Code Online (Sandbox Code Playgroud)
ListView有效,但是当我访问带有DetailView的URL时,我得到了.
AttributeError at /polls/2/
Generic detail view DetailView must be called with either an object pk or a slug.
Request Method: GET
Request URL: http://127.0.0.1:8000/polls/2/
Django Version: 1.4.1
Exception Type: AttributeError
Exception Value:
Generic detail view DetailView must be called with either …Run Code Online (Sandbox Code Playgroud) 我在django中创建URL视图时遇到问题.它给了我这个错误(ferrol是一个Space对象):
TypeError at /spaces/ferrol/
'str' object is not callable
Request Method: GET
Request URL: http://localhost:8000/spaces/ferrol/
Django Version: 1.2.3
Exception Type: TypeError
Exception Value:
'str' object is not callable
Exception Location: /usr/local/lib/python2.6/dist-packages/Django-1.2.3-py2.6.egg/django/core/handlers/base.py in get_response, line 100
Run Code Online (Sandbox Code Playgroud)
这是代码:
空间/ models.py
class Space(models.Model):
"""
Basic spaces model.
"""
name = models.CharField(_('Name'), max_length=100, unique=True)
description = models.TextField(_('Description'))
date = models.DateTimeField(auto_now_add=True)
logo = models.ImageField(upload_to='spaces/logos',
verbose_name=_('Logotype'))
banner = models.ImageField(upload_to='spaces/banners',
verbose_name=_('Banner'))
Run Code Online (Sandbox Code Playgroud)
主urls.py
urlpatterns = patterns('',
# Django administration
(r'^admin/', include(admin.site.urls)),
(r'^spaces/', include('apps.spaces.urls')),
(r'^static/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': 'static'}),
) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用基于Djangos类的通用视图编写CRUD应用程序.以下是我编写的用于在db中创建新用户的代码.
from django.views.generic import CreateView
from django.contrib.auth.decorators import login_required
from django.contrib import messages
class UserCreateView(CreateView):
"""
Display and accept a new user to be created in db
"""
form_class = ProfileForm
template_name = 'userdb/profile_form.html'
success_url = '/organization/users/'
def post(self, request, *args, **kwargs):
messages.success(request, "Success", extra_tags='msg')
return super(UserCreateView, self).post(request, *args, **kwargs)
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(UserCreateView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
请注意,要添加要显示给用户的成功消息,我必须扩展post函数.我知道这不是一个好方法,因为当调用此函数时,不确定提交的表单是否包含有效数据.所以我的问题是,是否有推荐的方法将Djangos消息传递框架与基于类的通用视图相结合?
我正在深入研究Django的通用视图,弄清楚它们如何返回一个简单的HttpResponse对象,就像一个简单的视图函数一样.
我编写了一个简单的测试项目,并在文件django/views/generic/base.py中定义的基本View类中添加了一些日志记录命令,以便我可以跟踪引擎底下发生的事情.
我在研究过程中遇到了一些问题.
我一直在努力保持这篇文章的简短,但是,为了完全理解我认为必须包含代码片段和日志.
我会非常感谢任何花时间发表一些有用评论的人,可能会回答我的一些问题.
urls.py
from django.conf.urls import patterns, url
from views import WelcomeView
urlpatterns = patterns('',
url(r'^welcome/(?P<name>\w+)/$', WelcomeView.as_view()),
)
Run Code Online (Sandbox Code Playgroud)
views.py
from django.http import HttpResponse
from django.views.generic import View
class WelcomeView(View):
def get(self, request, name):
return HttpResponse('What is up, {0}?'.format(name))
Run Code Online (Sandbox Code Playgroud)
Django的/视图/通用/ base.py
class View(object):
"""
Intentionally simple parent class for all views. Only implements
dispatch-by-method and simple sanity checking.
"""
http_method_names = ['get', 'post', 'put', 'delete', 'head', 'options', 'trace']
def __init__(self, **kwargs):
#####logging
logging.error('*** View.__init__ is started with kwargs: …Run Code Online (Sandbox Code Playgroud) 我有一个具有ManyToMany关系的模型,我想用CheckBoxSelectMultiple小部件更新,而其他一切都使用默认的通用形式,但是当我重新定义那个表单字段时,它是唯一一个出现在UpdateView中的表单字段.有没有办法只使用一个字段的小部件,而无需重新定义整个表单?
Views.py:
from django.views.generic.edit import UpdateView
from kunden.models import Kunde, Unternehmenstyp
from kunden.forms import KundeEditForm
class KundeUpdate(UpdateView):
model = Kunde
form_class = KundeEditForm
template_name = 'kunden/kunde_update.html'
success_url = '/'
Run Code Online (Sandbox Code Playgroud)
forms.py:
from django.forms.widgets import CheckboxSelectMultiple
from django.forms import ModelMultipleChoiceField,ModelForm
from kunden.models import Kunde, Unternehmenstyp
class KundeEditForm(ModelForm):
model = Kunde
unternehmenstyp = ModelMultipleChoiceField(widget=CheckboxSelectMultiple,required=True, queryset=Unternehmenstyp.objects.all())
Run Code Online (Sandbox Code Playgroud)
我知道这有一个非常简单的解决方案,所以感谢大家提前耐心等待.
虽然我在这里可以推荐任何值得阅读的django书吗?我已经完成了基础教程,根据需要挖掘了文档,并阅读了Django的两个Scoops:https://django.2scoops.org/所以如果你能为我这个级别的人想到一本书,那就是非常感激.再次感谢
我正在尝试为模型查询集创建list_view.运行我的服务器时,它返回:属性错误 - 'function'对象没有属性'as_view'.我很感激帮助我解决这个问题.
这是我的代码:
Views.py:
@login_required
class live_bids(ListView):
model = Post
template_name = 'loggedin_load/live_bids.html'
def get_queryset(self):
return Post.objects.all().prefetch_related('bids').filter(user=self.request.user)
Run Code Online (Sandbox Code Playgroud)
urls.py:
url(r'^live_bids/$', live_bids.as_view()),
Run Code Online (Sandbox Code Playgroud) 我是python的新手,并在这里继续阅读Django框架教程的第4部分.我正在尝试为民意调查应用程序实现通用视图 - 我的代码似乎是正确的(据我所知),但当我尝试投票时,我得到一个NoReverseMatch异常,指出:
使用参数'(1L,)'和关键字参数'{}'找不到'polls/poll_results'的反转.
在我尝试通用视图之前,我的代码工作正常,但我现在似乎无法查明问题.
这是poll目录中urls.py的代码:
from django.conf.urls.defaults import *
from djtest.polls.models import Poll
info_dict = {
'queryset': Poll.objects.all(),
}
urlpatterns = patterns('',
(r'^$', 'django.views.generic.list_detail.object_list', info_dict),
(r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict),
url(r'^(?P<object_id>\d+)/results/$', 'django.views.generic.list_detail.object_detail', dict(info_dict, template_name='polls/results.html'), 'poll_results'),
(r'^(?P<poll_id>\d+)/vote/$', 'djtest.polls.views.vote'),
)
Run Code Online (Sandbox Code Playgroud)
这是views.py:
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404
from django.core.urlresolvers import reverse
from djtest.polls.models import Poll, Choice
def vote(request, poll_id):
p = get_object_or_404(Poll, pk=poll_id)
try:
selected_choice = p.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
#redisplay form
return render_to_response('polls/poll_detail.html', {
'object': …Run Code Online (Sandbox Code Playgroud) django ×10
python ×6
django-views ×4
django-forms ×1
django-urls ×1
exception ×1
python-2.7 ×1
syntax ×1