尝试错误地更新表单时如何解决“'__proxy__'对象没有属性'get'“

时间:2019-05-18 17:57:23

标签: python django

我有一个简单的书籍模型:

class Book(models.Model):
    isbn = models.CharField(_('ISBN'),
        validators=[RegexValidator('^[0-9 -]+$', message="ISBN must contains only numbers or hyphens!")] ,
        max_length=13, unique=True)
    title = models.CharField(_('Book\'s title'), max_length=128)
    publisher = models.CharField(_('Publisher'), max_length=64)
    author = models.CharField(_('Author'), max_length=64)
    pages = models.IntegerField(_('Pages'), default=0)
    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    updated_at = models.DateTimeField(auto_now=True, editable=False)

    def __str__(self):
        return self.title

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

我正在编码一个原始系统,并且UpdateView有问题。 当我尝试进行正确的更新时,此视图正常工作,但是当我插入错误的值(例如isbn中的字母或页面中的字母)时,出现此错误:

Reverse for 'update' with arguments '('31234-11a',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['books/update/(?P<isbn>[\\d\\-]+)/$']

编辑: 这是我的看法:

class BookUpdateView(UpdateView):
    """Update the requested book."""
    model = Book
    form_class = BookForm

    def get_object(self):
        pk = self.kwargs.get(self.pk_url_kwarg, None)
        queryset = self.get_queryset()
        queryset = queryset.filter(isbn=self.kwargs['isbn'])
        if not queryset.exists():
            messages.error(self.request, 'This book doesnt exist!')
            return get_object_or_404(Book, **self.kwargs)
        return queryset.get()

    def get_success_url(self):
        messages.success(self.request, 'The book updated successfully!')
        return reverse_lazy('books:detail', kwargs = {'isbn': self.object.isbn})

    def form_invalid(self, form):
        messages.error(self.request, 'The update has failed')
        return self.render_to_response(self.get_context_data(form=form))

和我的更新网址:


urlpatterns = [
    url(r'^update/(?P<isbn>[\d\-]+)/$', view=views.BookUpdateView.as_view(), name='update'),
]

为什么我需要在此项目idk中使用Django 1.10?如果有人可以推荐我一些阅读材料,或回答问题,那就太好了。谢谢

2 个答案:

答案 0 :(得分:1)

您的invokeMethodform_valid方法不能不能返回form_invalid对象,因为它不是HTTP响应。

不过,您可以使用redirect(..) [Django-doc],它将构建HTTP响应,例如:

lazy_reverse(..)

您可以使用以下方法稍微改善from django.shortcuts import redirect class BookUpdateView(UpdateView): """Update the requested book.""" model = Book form_class = BookForm # ... def get_success_url(self): messages.success(self.request, 'The book updated successfully!') return reverse_lazy('books:detail', kwargs = {'isbn': self.object.isbn}) def form_invalid(self, form): messages.error(self.request, 'The update has failed') return redirect('books:index')方法:

get_object

from django.http import Http404 from django.shortcuts import redirect class BookUpdateView(UpdateView): """Update the requested book.""" model = Book form_class = BookForm def get_object(self): queryset = self.get_queryset() try: return queryset.get(isbn=self.kwargs['isbn']) except: messages.error(self.request, 'This book doesnt exist!') raise Http404('Book does not exist')的情况下,redirect(..) 不是很常见。通常,模板使用表单 renderender ,以使表单呈现错误消息。因此,覆盖form_invalid(..)方法不是很常见:默认情况下,Django将使用无效的格式重新渲染模板。

编辑:如果form_invalid未映射到有效页面上,您可以将页面重定向到另一页面,如下所示:

isbn

答案 1 :(得分:0)

您也可以在变量中创建反向延迟并使用运行良好的变量重定向:

代替

return reverse_lazy('books:detail', kwargs = {'isbn': self.object.isbn})

使用:

url_match = reverse_lazy('books:detail', kwargs = {'isbn': self.object.isbn})
return redirect(url_match)