2017-02-22 93 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']'中。 –

相關問題