2017-07-27 106 views
-2

我正在开发一个基于关于书籍的信息的网站,并且我想要显示出现在HTML页面的作者表中的所有作者。当我点击链接“作者”时,页面没有呈现,并且出现错误“用户匹配查询不存在”。 (不让我在这里发布图片)。 这是从终端回溯。.objects.all()查询在Django中不起作用

Internal Server Error: /books/authors/ 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\django\core\handlers\exception.py", line 41, in inner 
    response = get_response(request) 
    File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Users\Pallav\PycharmProjects\onlineBookStore\onlineBookStore\books\views.py", line 35, in follow_user 
    user_to_be_followed = User.objects.get(username=username) 
    File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 85, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\django\db\models\query.py", line 380, in get 
    self.model._meta.object_name 
DoesNotExist: User matching query does not exist. 

我试着运行python manage.py shell中的查询,它会产生一个正确的查询集。

urls.py文件是:

app_name = 'books' 

urlpatterns = [ 
    # /books/ 
    url(r'^$', views.IndexView.as_view(), name='index'), 

    # /register/ 
    url(r'register/$', views.UserFormView.as_view(), name='register'), 

    # /logout/ 
    url(r'logout/$', views.logout_user, name='logout'), 

    # /login/ 
    url(r'login/$', views.login_user, name='login'), 

    # /search/ 
    url(r'search/$', views.search, name='search'), 

    # /add_book/ 
    url(r'search/(?P<isbn>[0-9]+)/add_book$', views.add_book, name='add_book'), 

    # /books/<book_id>/ 
    url(r'^(?P<book_id>[0-9]+)/$', views.detail, name='detail'), 

    # /books/favorite/ 
    url(r'^(?P<book_id>[0-9]+)/favorite/$', views.favorite, name='favorite'), 

    # /books/rate/ 
    url(r'^(?P<book_id>[0-9]+)/rate/$', views.rate, name='rate'), 

    # /books/review/ 
    url(r'^(?P<book_id>[0-9]+)/review/$', views.review, name='review'), 

    # /books/borrow/ 
    url(r'^(?P<book_id>[0-9]+)/borrow/$', views.borrow, name='borrow'), 

    # books/user_profile/ 
    url(r'user_profile/$', views.user_profile, name='user_profile'), 

    # books/edit_profile 
    url(r'edit_profile/$', views.edit_profile, name='edit_profile'), 

    # books/login_btn 
    url(r'login_btn/$', views.login_btn, name='login_btn'), 

    # books/show_users 
    url(r'show_users/$', views.show_users, name='show_users'), 

    # books/<username>/ 
    url(r'^(?P<username>[a-z]*[A-Z]*[0-9]*)/$', views.follow_user, name='follow_user'), 

    # books/authors/ 
    url(r'authors/$', views.authors, name='authors'), 
] 

我的视图功能是:

def authors(request): 
    all_authors = Authors.objects.all() 
    return render(request, 'books/authors.html', {'all_authors': all_authors}) 

def follow_user(request, username): 
    user_following = request.user 

    if user_following is not None: 
     user_to_be_followed = User.objects.get(username=username) 
     Follow.objects.add_follower(user_following, user_to_be_followed) 
     return render(request, 'books/test.html') 
    else: 
     return render(request, 'books/registration_form.html') 

我的HTML页面authors.html是:

{% extends 'books/base.html' %} 

{% block title %}All authors{% endblock %} 
{% block body %} 

    <div class="users-container container-fluid"> 

     <!-- Books --> 
     <div class="row"> 
      {% if all_authors %} 
       {% for author in all_authors %} 

        <div class="col-sm-4 col-lg-2"> 
         <div class="thumbnail"> 
          <h1>{{ author.name }}</h1> 
         </div> 
        </div> 
        <br> 

       {% endfor %} 
      {% else %} 
       <h3>Currently no authors available</h3> 
      {% endif %} 
     </div> 

    </div> 

{% endblock %} 

视图功能 “follow_user” 是只是为了进入数据库,它没有与其关联的HTML页面。

test.html的是

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 
    {% load friendshiptags %} 


    <h1> {% following request.user %} </h1> 

</body> 
</html> 

我曾参观过不同的链接到类似的问题,但他们没有解决我的问题。链接1:objects.all() query not working 链接2:Django objects.all() empty query set, not empty in shell

非常感谢您的帮助。由于

+2

请再次查看您的堆栈跟踪。您提供的视图不是导致问题的视图。在“File”C:\ Users \ Pallav \ PycharmProjects \ onlineBookStore \ onlineBookStore \ books \ views.py中调用'user_to_be_followed = User.objects.get(username = user_id)'时,出现问题,第35行,follow_user' – an0o0nym

+0

如你所见,你没有在功能上进行任何查询。当然你的问题在urls.py中。然后发布完整的urls.py代码 – Aniket

+0

,@ alasdair的编辑答案应该适合你。 – Aniket

回答

3

你向我们展示了似乎不错,但在某处你的代码,你有这样的一行代码:

User.objects.get(username=user_id) 

既然你尝试使用用户名匹配的ID,它不会找到任何东西,当get()没有发现它会引发异常。

你应该做一些事情来捕捉错误,如except User.DoesNotExists,并修复你的病情。

4

您对/books/authors/的请求正在由follow_user视图处理,因为它们都匹配,并且follow_user模式高于authors模式。

# books/<username>/ 
url(r'^(?P<username>[a-z]*[A-Z]*[0-9]*)/$', views.follow_user, name='follow_user'), 

# books/authors/ 
url(r'authors/$', views.authors, name='authors'), 

你可以通过改变正则表达式,使他们不冲突,或者通过移动authors模式follow_user图案上方(注意:这会阻止你与username='authors'用户以下)解决这个问题。

一旦你定你的URL模式,回溯表明,有在你的follow_user看待问题,你应该解决:

user_to_be_followed = User.objects.get(username=username) 

如果有机会的话,用户不会在存在数据库,那么你也想要处理这种可能性。你可以捕获该异常:

try: 
    user_to_be_followed = User.objects.get(username=username) 
except User.DoesNotExist: 
    user_to_be_followed = None 

或者,你可以使用get_object_or_404快捷:

from django.shortcuts import get_object_or_404 

user_to_be_followed = get_object_or_404(User, username=username) 

最后,请注意下面的检查是不正确的:

user_following = request.user 
if user_following is not None: 
    ... 

如果用户没有登录,那么request.user将是一个匿名用户,它不会是None。您应该在早期版本中检查Django 1.10+或if request.user.is_authenticated():中的if request.user.is_authenticated:

+0

作者模块不需要任何用户,也不需要查询用户表。此外,作者表与用户表无关(阅读:foreign_key等)。我不知道为什么回溯显示这种说法。我将编辑我的问题以包含这些细节。另外,我在命名上犯了一个错误。 user_id实际上是用户名。谢谢你,我会解决它。 –

+0

回溯显示错误发生的位置。如果代码不在'authors'视图中,那意味着Django没有运行authors视图。你的url模式可能有错误(例如,缺少'$'的正则表达式) - 你没有显示你的完整url,所以我不知道。 – Alasdair

+0

如果你已经修改了代码,您应该添加新的回溯 - 你不应该有'的'回溯User.objects.get(用户名= USER_ID)了。 – Alasdair