2016-09-07 6 views
1

ich bekam die folgenden Zurückverfolgungs wenn ich versuche, Inline-formset in django zu speichern:Typeerror bei/add/unhashable Typ: 'list'

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'] 

Traceback:

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) 

Meine Ansichten:

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 

Kann jemand mir den Weg vorschlagen, diese Fehler zu beheben?

+0

Bitte zeigen Sie Ihre Methode 'Author.get_absolute_url' an. – Alasdair

+0

irgendwo müssen Sie die Liste öffnen, bevor Sie das Argument übergeben. wie Funktion (* Liste) anstelle von Funktion (Liste). Von Stack-Trace ist nicht klar. Versuchen Sie, vollständige Traceback – sprksh

+1

def get_absolute_url (self): zurückgeben ('Bücher: Detail', kwargs = {'pk': self.pk}) Diese löschen nicht aushaschbar Typ: 'Liste' Fehler, sondern gibt neue Fehler auf Reverse für 'book_list' mit Argumenten '()' und Schlüsselwortargumenten '{}' nicht gefunden. 0 Muster (s) versucht: [] –

Antwort

0

Aus Ihrer Frage und Kommentare, ich glaube, Sie folgende Dinge richtig überprüfen müssen:

Ihre get_absolute_url sollte Reverse-Methode haben, wie Sie zu Ihrem commments hinzugefügt:

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

Danach sollten Sie Ihre überprüfen Vorlagen wurden korrekt für 'book_list' mit entsprechenden Argumenten umgekehrt. Nehmen wir an:

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

Und schließlich Ihre Urls überprüfen, das sollte wie:

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

Hope this helfen.

+1

Danke, es hat funktioniert. –

Verwandte Themen