我有一个简单的书籍模型:
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?如果有人可以推荐我一些阅读材料,或回答问题,那就太好了。谢谢
答案 0 :(得分:1)
您的invokeMethod
和form_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)