我有一种情况,我试图在用户无权查看记录或记录不存在的情况下向用户发送不同的消息。如果出现404,我已经能够获得将消息发送给用户的界面,但是我无法根据记录的标准弄清楚逻辑。我一直在玩get,get_object或get_object_or_404,但没有任何效果。
这是我的DetailView。
class BookSearchDetailView(LoginRequiredMixin,DetailView):
model = Book
context_object_name = 'book_detail'
template_name = 'book/book_search_detail.html'
def get_object(self, queryset=None):
return get_object_or_404(Book, book_number=self.request.GET.get("q"))
def get(self, request, *args, **kwargs):
book_number=self.request.GET.get("q")
try:
self.object = self.get_object()
except Http404:
messages.add_message(self.request, messages.INFO, 'Book Number %s Not Found' % book_number )
return HttpResponseRedirect(reverse('Book:book_number_search'))
context = self.get_context_data(object=self.object)
return self.render_to_response(context)
except Not a Preference:
Book_number exists but is not self.request.user.preferences.all()
我意识到“ Not a Preference”除外项不起作用,但我正在说明自己想做的事情。
这是我的模特。
class Book(models.Model):
book_name = models.CharField(max_length=80,null=True,unique=False)
book_number = models.IntegerField(editable=True,null=True)
请注意,我没有为模型定义块。在上面的当前代码中,这不会引起任何问题。当我玩了不同的代码变体时,收到的错误消息之一是必须用pk或slug调用DetailView。
我最终试图过滤书籍,以便如果用户没有允许他们看到书籍的属性,则基本上不会返回任何书籍。
我也尝试覆盖get_queryset,但是当我使用下面的代码时,
def get_queryset(self):
queryset = super(BookSearchDetailView, self).get_queryset()
return queryset.filter(book_number__in=self.request.user.preferences.all())
但是,当我定义上面的代码时,我的DetailView似乎不尊重它或没有任何效果。
我读到的是get_object要么获取对象,要么获取404。我已经完成了那部分工作。只是无法弄清楚如何合并错误消息的第三种形式。
预先感谢您的任何想法。