/ error / unhashable类型的TypeError:'list'

时间:2016-09-07 14:50:22

标签: django

当我尝试在django中保存内联formset时,我得到了以下回溯:

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

有人可以建议我修复此错误的方法吗?

1 个答案:

答案 0 :(得分:0)

从您的问题和评论中,我认为您需要检查以下内容:

你的get_absolute_url应该有你添加到你的通讯中的反向方法:

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'),

希望这会有所帮助。