gpt4 book ai didi

python - 如何修复 "' __proxy_ _' object has no attribute ' get' "当尝试错误地更新表单时

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:34 26 4
gpt4 key购买 nike

伙计们,我有一个简单的书籍模型:

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})

我正在编写一个 crud 系统,但 UpdateView 有问题。当我尝试进行正确的更新时,此 View 工作正常,但当我插入错误的值(如 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'),
]

我需要在这个项目中使用 Django 1.10,我知道为什么。如果有人可以推荐我阅读一些 Material ,或者回答问题,那就太好了。谢谢

最佳答案

您的 form_validform_invalid 方法可以返回一个 lazy_reverse(..) 对象,因为那是不是 HTTP 响应。

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

from django.shortcuts import <b>redirect</b>

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 <b>redirect('books:index')</b>

您可能可以通过以下方式略微改进您的 get_object 方法:

from django.http import <b>Http404</b>
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')

然而,在 form_invalid(..) 的情况下,redirect(..) 并不常见。通常,模板会重新呈现 与表单一起呈现,以便呈现带有错误消息的表单。因此,重写 form_invalid 方法不是很常见:默认情况下,Django 将重新呈现具有无效表单的模板。

编辑:如果 isbn 没有映射到有效的页面,您可以将页面重定向到另一个页面,如下所示:

from django.core.exceptions import <b>ObjectDoesNotExist</b>
from django.http import <b>Http404</b>
from django.shortcuts import redirect

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

# ...

def get(self, *args, **kwargs):
<b>try:</b>
self.object = self.get_object()
<b>except (ObjectDoesNotExist, Http404):</b>
return <b>redirect('books:index')</b>
return self.render_to_response(self.get_context_data())

关于python - 如何修复 "' __proxy_ _' object has no attribute ' get' "当尝试错误地更新表单时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56201518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com