2016-09-07 62 views
1

我得到了下面的回溯,當我嘗試保存在線表單集在Django:類型錯誤在/添加/ unhashable類型: '名單'

Django Version: 1.10 
Python Version: 3.5.1 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'books', 
'bootstrapform'] 

回溯:

File "D:\virtualEnv\lib\site-packages\django\core\handlers\exception.py" in inner 
    39.    response = get_response(request) 

File "D:\virtualEnv\lib\site-packages\django\core\handlers\base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "D:\virtualEnv\lib\site-packages\django\core\handlers\base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "D:\virtualEnv\lib\site-packages\django\views\generic\base.py" in view 
    68.    return self.dispatch(request, *args, **kwargs) 

File "D:\virtualEnv\lib\site-packages\django\views\generic\base.py" in dispatch 
    88.   return handler(request, *args, **kwargs) 

File "D:\virtualEnv\inlineformset\books\views.py" in post 
    27.    return self.form_valid(form, formset) 

File "D:\virtualEnv\inlineformset\books\views.py" in form_valid 
    52.   return redirect(self.object.get_absolute_url()) 

File "D:\virtualEnv\lib\site-packages\django\shortcuts.py" in redirect 
    56.  return redirect_class(resolve_url(to, *args, **kwargs)) 

File "D:\virtualEnv\lib\site-packages\django\shortcuts.py" in resolve_url 
    147.   return reverse(to, args=args, kwargs=kwargs) 

File "D:\virtualEnv\lib\site-packages\django\urls\base.py" in reverse 
    91.  return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))) 

File "D:\virtualEnv\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix 
    343.   possibilities = self.reverse_dict.getlist(lookup_view) 

File "D:\virtualEnv\lib\site-packages\django\utils\datastructures.py" in getlist 
    140.    return super(MultiValueDict, self).__getitem__(key) 

我的觀點:

class FormsetMixin(object): 
    object = None 

    def get(self, request, *args, **kwargs): 
     if getattr(self, 'is_update_view', False): 
      self.object = self.get_object() 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     formset_class = self.get_formset_class() 
     formset = self.get_formset(formset_class) 
     return self.render_to_response(self.get_context_data(form=form, formset=formset)) 

    def post(self, request, *args, **kwargs): 
     if getattr(self, 'is_update_view', False): 
      self.object = self.get_object() 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     formset_class = self.get_formset_class() 
     formset = self.get_formset(formset_class) 
     if form.is_valid() and formset.is_valid(): 
      return self.form_valid(form, formset) 
     else: 
      return self.form_invalid(form, formset) 

    def get_formset_class(self): 
     return self.formset_class 

    def get_formset(self, formset_class): 
     return formset_class(**self.get_formset_kwargs()) 

    def get_formset_kwargs(self): 
     kwargs = { 
      'instance': self.object 
     } 
     if self.request.method in ('POST', 'PUT'): 
      kwargs.update({ 
       'data': self.request.POST, 
       'files': self.request.FILES, 
      }) 
     return kwargs 

    def form_valid(self, form, formset): 
     self.object = form.save() 
     formset.instance = self.object 
     formset.save() 
     return redirect(self.object.get_absolute_url()) 

    def form_invalid(self, form, formset): 
     return self.render_to_response(self.get_context_data(form=form, formset=formset)) 


class AuthorCreateView(FormsetMixin, CreateView): 
    template_name = 'books/author_and_books_form.html' 
    model = Author 
    form_class = AuthorForm 
    formset_class = BookFormSet 


class AuthorUpdateView(FormsetMixin, UpdateView): 
    template_name = 'books/author_and_books_form.html' 
    is_update_view = True 
    model = Author 
    form_class = AuthorForm 
    formset_class = BookFormSet 


class BookList(ListView): 
    model = Book 


class BookDetail(DetailView): 
    model = Book 


class AuthorList(ListView): 
    model = Author 


class AuthorDetail(DetailView): 
    model = Author 

任何人都可以建議我解決這個錯誤的方法嗎?

+0

請顯示您的'Author.get_absolute_url'方法。 – Alasdair

+0

某處你可能必須在傳遞參數之前打開列表。像函數(* list)而不是函數(list)。從堆棧跟蹤它不清楚。嘗試發佈完整的回溯 – sprksh

+1

def get_absolute_url(self): return reverse('books:detail',kwargs = {'pk':self.pk}) 這種擦除不可重複的類型:'list'錯誤,但在Reverse找不到參數'()'和關鍵字參數'{}'的'book_list'。 0模式(S)嘗試:[] –

回答

0

從你的問題和意見,我想你需要檢查以下兩不誤:

你get_absolute_url應該有逆向法像你添加到您的commments:

def get_absolute_url(self): 
    return reverse('books:book_detail', kwargs={'pk': self.pk}) 

之後,你應該檢查你的使用適當參數正確反轉'book_list'的模板。假設:

<a href="{% url 'books:book_list' %}">Books</a> 

最後檢查你的網址,應該是這樣的:

url(r'^$', views.BookList.as_view(), name='book_list'), 
url(r'^(?P<pk>\d+)/$', views.BookDetail.as_view(), name='book_detail'), 

希望這會有所幫助。

+1

謝謝,它的工作。 –

相關問題