';元组';对象没有属性';获取';请求基于类的视图Django时

';元组';对象没有属性';获取';请求基于类的视图Django时,django,django-views,django-class-based-views,Django,Django Views,Django Class Based Views,嗨,这应该是一个简单的我相信。我对基于类的观点失去了耐心。不太清楚他们是如何简化事情的。基于函数的视图看起来更具可读性,更有意义。无论如何,我正在尝试将我的一个函数视图转换为一个类视图,当我请求该视图时出现了这个错误 “tuple”对象没有属性“get” PS我使用的是django 1.8.1,导入视图的方式是通过django.views.generic.View,而不是文档中描述的django.views.View。可能是相关的 这是url.py from django.conf.urls i

嗨,这应该是一个简单的我相信。我对基于类的观点失去了耐心。不太清楚他们是如何简化事情的。基于函数的视图看起来更具可读性,更有意义。无论如何,我正在尝试将我的一个函数视图转换为一个类视图,当我请求该视图时出现了这个错误

“tuple”对象没有属性“get”

PS我使用的是django 1.8.1,导入视图的方式是通过django.views.generic.View,而不是文档中描述的django.views.View。可能是相关的

这是url.py

from django.conf.urls import url
from . import views


urlpatterns = [
    url(r'^upload_photo/$', views.upload_photo, name='upload_photo'),
    url(r'^upload_photo_class/$', views.UploadPhotoView.as_view()),
    ]
这是基于类的视图

class UploadPhotoView(View):
    form = PhotoModelForm
    formset = formset_factory(PhotoExtendedModelForm, max_num=1, validate_min=True)
    template_name = 'upload_photo.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def get(self, request):
        form = self.form
        formset = self.formset
        return (request, self.template_name, {'form': form,
                                          'formset': formset})

    def post(self, request, *args, **kwargs):
        form = self.form(request.POST, request.FILES)
        formset = self.formset(request.POST)
        if all([form.is_valid(), formset.is_valid()]):

            photo = form.save()
            photo_instance = photo
            user_id = request.user

            for inline_form in formset:

                data = inline_form.save(commit=False)
                data.Photo = photo_instance
                data.user = user_id
                data.save()

            return render(request, 'upload_photo_done.html')

        else:
            return (request, self.template_name, {'form': form,
                                              'formset': formset})
@login_required
def upload_photo(request):
    form = PhotoModelForm
    formset = formset_factory(PhotoExtendedModelForm, max_num=1, validate_min=True)

    if request.method == 'POST':
         form = form(request.POST, request.FILES)
         formset = formset(request.POST)
         if all([form.is_valid(), formset.is_valid()]):

            photo = form.save()
            photo_instance = photo
            user_id = request.user

            for inline_form in formset:

                data = inline_form.save(commit=False)
                data.Photo = photo_instance
                data.user = user_id
                data.save()

            return render(request, 'upload_photo_done.html')

        else:
            return render(request, 'upload_photo.html', {'form': form, 'formset': formset})
    else:
        return render(request, 'upload_photo.html', {'form': form, 'formset': formset})
这是原始的基于函数的视图

class UploadPhotoView(View):
    form = PhotoModelForm
    formset = formset_factory(PhotoExtendedModelForm, max_num=1, validate_min=True)
    template_name = 'upload_photo.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def get(self, request):
        form = self.form
        formset = self.formset
        return (request, self.template_name, {'form': form,
                                          'formset': formset})

    def post(self, request, *args, **kwargs):
        form = self.form(request.POST, request.FILES)
        formset = self.formset(request.POST)
        if all([form.is_valid(), formset.is_valid()]):

            photo = form.save()
            photo_instance = photo
            user_id = request.user

            for inline_form in formset:

                data = inline_form.save(commit=False)
                data.Photo = photo_instance
                data.user = user_id
                data.save()

            return render(request, 'upload_photo_done.html')

        else:
            return (request, self.template_name, {'form': form,
                                              'formset': formset})
@login_required
def upload_photo(request):
    form = PhotoModelForm
    formset = formset_factory(PhotoExtendedModelForm, max_num=1, validate_min=True)

    if request.method == 'POST':
         form = form(request.POST, request.FILES)
         formset = formset(request.POST)
         if all([form.is_valid(), formset.is_valid()]):

            photo = form.save()
            photo_instance = photo
            user_id = request.user

            for inline_form in formset:

                data = inline_form.save(commit=False)
                data.Photo = photo_instance
                data.user = user_id
                data.save()

            return render(request, 'upload_photo_done.html')

        else:
            return render(request, 'upload_photo.html', {'form': form, 'formset': formset})
    else:
        return render(request, 'upload_photo.html', {'form': form, 'formset': formset})
以下是回溯:

Request Method: GET
Request URL: http://127.0.0.1:8000/otologue/upload_photo_class/

Django Version: 1.8.1
Python Version: 3.4.4
Installed Applications:
('account',
 'photologue_custom',
 'otologue',
 'photologue',
 'sortedm2m',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sitemaps')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "../venv/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  223.                 response = middleware_method(request, response)
File "../venv/lib/python3.4/site-packages/django/middleware/clickjacking.py" in process_response
  31.         if response.get('X-Frame-Options', None) is not None:

Exception Type: AttributeError at /otologue/upload_photo_class/
Exception Value: 'tuple' object has no attribute 'get'
在def get()中,应该像这样返回一个HttpResponse对象

     HttpResponseRedirect('/success/')
或者使用render()重定向到模板。您正试图返回一个带有呈现函数调用参数的普通元组。

在def get()中,您应该像这样返回一个HttpResponse对象

     HttpResponseRedirect('/success/')

或者使用render()重定向到模板。您正在尝试返回带有呈现函数调用参数的普通元组。

您希望从
FormView
继承,而不仅仅是
视图
。因此,您的第一行是
类上传照片视图(FormView):

它将简化许多表单处理和样板文件,这是基于类的视图的许多好处。像往常一样,这是伟大的

在您的情况下,它可能非常简单:

class UploadPhotoView(FormView):
    form_class = PhotoModelForm
    template_name = 'upload_photo.html'
    success_url = '/upload-done/' # set url to TemplateView.as_view(template_name="upload_photo_done.html")

 def form_valid(self, form):
     # do the stuff in your POST method
     return super(UploadPhotoView, self).form_valid(form)`

您希望从
FormView
继承,而不仅仅是
view
。因此,您的第一行是
类上传照片视图(FormView):

它将简化许多表单处理和样板文件,这是基于类的视图的许多好处。像往常一样,这是伟大的

在您的情况下,它可能非常简单:

class UploadPhotoView(FormView):
    form_class = PhotoModelForm
    template_name = 'upload_photo.html'
    success_url = '/upload-done/' # set url to TemplateView.as_view(template_name="upload_photo_done.html")

 def form_valid(self, form):
     # do the stuff in your POST method
     return super(UploadPhotoView, self).form_valid(form)`

你能发布完整的堆栈跟踪吗?你能发布完整的堆栈跟踪吗?嗨,谢谢你的工作!我也对post()else:part做了同样的处理,并在那里放置了一个渲染。不客气。请接受这个答案,这样其他人在遇到类似情况时会有清晰的想法。嗨,谢谢你的帮助!我也对post()else:part做了同样的处理,并在那里放置了一个渲染。不客气。请接受这一点作为答案,这样其他人在遇到类似情况时会有清晰的想法。您好,谢谢您的建议,我已尝试实施更改,但这样做会导致“请求”功能出现错误。据我所知,表格将获得帖子信息,它也会获得文件吗?为了确定用户id在FormView中的工作方式,我认为文件应该是
格式。已清理的\u数据['your\u upload\u name']
self.request.files['your\u upload\u name']]
。您好,谢谢您的建议,我已经尝试实现了这些更改,但这样做会导致“request”函数出现错误。据我所知,表格将获得帖子信息,它也会获得文件吗?为了确定用户id在FormView中的工作方式,我认为文件应该是
格式。已清理的数据['your\u upload\u name']
self.request.files['your\u upload\u name']