2017-02-22 35 views
1

嗨,这应该是一个简单的,我敢肯定。只是失去了耐心的课堂观点。不太确定他们如何简化事情。基于功能的视图看起来更可读,更有意义。反正我想我的功能一个视图转换为一个类和得到这个错误,当我要求查看当请求基于类的视图时,'tuple'对象没有'get'属性Django

“元组”对象有没有属性“得到”

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 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' 
+0

您可以发布完整的堆栈跟踪? – patito

回答

0

在DEF得到(),你应该返回的HttpResponse对象这样

 HttpResponseRedirect('/success/') 

或使用渲染()重定向到模板。你正试图用渲染函数调用参数返回一个简单的元组。

+0

嗨,谢谢你的工作!我也对post()else做了同样的处理,并在其中放置了一个渲染器。 –

+0

不客气。请接受这个答案,以便其他人在遇到类似情况时能够清楚地知道。 –

0

您想从FormView继承,而不仅仅是view。所以你的第一行将是class UploadPhotoView(FormView):

这将简化很多你的表单处理和样板,这是很多基于类的视图的好处。像往常一样,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)` 
+0

嗨,感谢您的建议,我试图实施更改,但这样做会给'请求'功能带来错误。据我所知,form_valid将获得POST信息,它也会得到FILES?并确定user_id如何在FormView –

+0

中工作,我相信这些文件应该在'form.cleaned_data ['your_upload_name']'或'self.request.FILES ['your_upload_name']'中。 –

相关问题