'tuple' 对象在请求基于 class 的视图 Django 时没有属性 'get'
'tuple' object has no attribute 'get' when requesting class based view Django
您好,我相信这应该很简单。只是对基于 class 的观点失去了耐心。不太确定他们如何简化事情。基于函数的视图似乎更具可读性并且更有意义。无论如何,我正在尝试将我的功能视图之一转换为 class 视图,并在我请求视图
时收到此错误
'tuple' object has no attribute 'get'
PS 我使用的是 django 1.8.1,我导入 View 的方式是通过 django.views.generic.View 而不是 django.views.View ,如文档中所述。可能相关。
这里是urls.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 的视图
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() 中,您应该 return 一个像这样的 HttpResponse 对象
HttpResponseRedirect('/success/')
或使用 render() 重定向到模板。您正在尝试 return 带有渲染函数调用参数的普通元组。
您想继承 FormView
而不仅仅是 view
。所以你的第一行将是 class UploadPhotoView(FormView):
它将大大简化您的表单处理和样板文件,这是基于 class 的视图的很多好处。和往常一样,Django documentation on this is很棒。
在您的情况下,可能简单如下:
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)`
您好,我相信这应该很简单。只是对基于 class 的观点失去了耐心。不太确定他们如何简化事情。基于函数的视图似乎更具可读性并且更有意义。无论如何,我正在尝试将我的功能视图之一转换为 class 视图,并在我请求视图
时收到此错误'tuple' object has no attribute 'get'
PS 我使用的是 django 1.8.1,我导入 View 的方式是通过 django.views.generic.View 而不是 django.views.View ,如文档中所述。可能相关。
这里是urls.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 的视图
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() 中,您应该 return 一个像这样的 HttpResponse 对象
HttpResponseRedirect('/success/')
或使用 render() 重定向到模板。您正在尝试 return 带有渲染函数调用参数的普通元组。
您想继承 FormView
而不仅仅是 view
。所以你的第一行将是 class UploadPhotoView(FormView):
它将大大简化您的表单处理和样板文件,这是基于 class 的视图的很多好处。和往常一样,Django documentation on this is很棒。
在您的情况下,可能简单如下:
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)`