我正在try 学习基于类的视图,因为详细视图或列表视图并不是那么复杂.

我有一个搜索表单,我只是想看看我是否发送了一个查询来显示结果.

这是函数代码(不是我的,来自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))

忽略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 = self.request.GET['query'].strip()
            if query:
                form = SearchForm({'query': query})
                self.bookmarks = Bookmark.objects.filter(title__icontains=query)[:10]
        return super(SearchPageView, self).get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(SearchPageView, self).get_context_data(**kwargs)
        context.update({
            'show_tags': True,
            'show_user': True,
            'show_results': self.show_results,
            'bookmarks': self.bookmarks
        })
        return context

不起作用,我得到一个:"‘NoneType’Object is not Callable"(‘NoneType’对象不可调用)

很公平,我今天就是从这些东西开始的.

那么,如何创建可以管理GET(如果需要还可以管理POST)请求的基于类的视图呢?

我还有一个例子:

@render_to('registration/register.html')
def register_page(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            user = User.objects.create_user(
                username=form.cleaned_data['username'],
                password=form.cleaned_data['password1'],
                email=form.cleaned_data['email']
            )
            return HttpResponseRedirect('/accounts/register/success/')
    else:
        form = RegistrationForm()
    return locals()

这个会不会像第一个一样被" retrofit "呢?或者他们持不同的观点?

我很困惑.我不知道第一个是ProcessFormView,第二个是FormView还是什么.

谢谢

我以EDIT:个解决方案结束:

class SearchPageView(FormView):
    template_name = 'search/search.html'

    def get(self, request, *args, **kwargs):
        self.bookmarks = []
        self.show_results = False
        form = SearchForm(self.request.GET or None)
        if form.is_valid():
            self.show_results = True
            self.bookmarks = Bookmark.objects.filter(title__icontains=form.cleaned_data['query'])[:10]

        return self.render_to_response(self.get_context_data(form=form))


    def get_context_data(self, **kwargs):
        context = super(SearchPageView, self).get_context_data(**kwargs)
        context.update({
            'show_tags': True,
            'show_user': True,
            'show_results': self.show_results,
            'bookmarks': self.bookmarks
        })
        return context

我在这里把这个问题留给有同样问题的人:)

推荐答案

FormView类的默认行为是为GET个请求显示未绑定的表单,为POST个(或PUT个)请求绑定表单.如果绑定表单有效,则调用form_valid方法,该方法只会重定向到成功url(由success_url属性或get_success_url方法定义).

这与示例非常吻合.在调用超类方法重定向到成功url之前,需要重写form_valid方法来创建新的User.

class CreateUser(FormView):
    template_name = 'registration/register.html'
    success_url = '/accounts/register/success/'
    form_class = RegistrationForm

    def form_valid(self, form):
        user = User.objects.create_user(
                username=form.cleaned_data['username'],
                password=form.cleaned_data['password1'],
                email=form.cleaned_data['email']
        )
        return super(CreateUser, self).form_valid(form)

您的第一个示例与FormView的流不太匹配,因为您不是在处理包含POST个数据的表单,并且当表单有效时您不需要执行任何操作.

我可以try 扩展TemplateView,把所有的逻辑放在get_context_data.

Django相关问答推荐

Django逆转ForeignKey返回无

如何在Django上创建ManyToMany管理面板?

Django Form初始值不在呈现上起作用

Django 中模型将数据存储在哪里?

在Django上传JPEG图像时遇到问题

如何删除django请求中的重复项

有什么方法可以自动设置 Debug True Django application

防止 django 将_id附加到外键字段

Django模型中的密码字段

Django 嵌套事务 - with transaction.atomic()

在 Bootstrap 中使单击的选项卡处于活动状态

有没有办法将变量传递给 Django 中的 extended模板?

如何将 Django forms.ChoiceField 呈现为 Twitter Bootstrap 下拉菜单

模型中的外键

Ruby on Rails 会影响网页的外观吗?

Django中视图的多个decorator :执行顺序

Django 存储匿名用户数据

Django Rest 框架 ImageField

Django - 安装 mysqlclient 错误:需要 mysqlclient 1.3.13 或更高版本;你有 0.9.3

Django将整数模型字段的范围设置为约束