V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dengwen168
V2EX  ›  Django

请问一下有会 django 的么?请教一个问题

  •  
  •   dengwen168 · 2020-04-26 21:27:46 +08:00 · 3524 次点击
    这是一个创建于 1672 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想使用 django.contrib.comments 给我的网站添加一个评论功能,

    按照网上的教程( https://mozillazg.com/2013/01/django-built-in-comments-framework.html )设置好了。

    可是我测试了一下,点击提交评论之后,它自动跳转到了: http://127.0.0.1:8000/comments/post/

    这个地址,然后报错:Exception Value: list index out of range

    我现在的问题是: 1.比如,设置好 django.contrib.comments 之后,我还需要自己在 views 中写 if request.method ==post 这样的来处理这个 post 请求吗?还是 django.contrib.comments 已经写好了,我根本不用管了。

    2.可是为什么我的不成功。我看他的报错信息那一行 city_details = Current.objects.filter(resortid = resortid) city_name = city_details[0].name

    ,在正常访问时,是没有问题的,不知为什么发了评论之后就出问题。

    请问有人知道原因么?谢谢。

    13 条回复    2020-04-28 11:59:52 +08:00
    jizai01
        1
    jizai01  
       2020-04-27 00:36:02 +08:00
    list index out of range,python 列表 越界,和 django 无关,自己打印一下 city_details 吧
    EricCartmann
        2
    EricCartmann  
       2020-04-27 07:24:15 +08:00 via iPhone
    问题 2 里面那句代码出错了,列表溢出,仔细想想列表有没有 0 这个索引。这是 Python 代码问题,和 django 没有关系。
    dengwen168
        3
    dengwen168  
    OP
       2020-04-27 08:17:11 +08:00
    @EricCartmann 可是这个页面我正常进入的时候访问是正常的,只有在发布了评论之后才报错。
    这个怎么修复呢?
    wdxm2008
        4
    wdxm2008  
       2020-04-27 08:18:42 +08:00
    用 try 来排除下 我 python 是到有可能报错的地方 print 一下 然后 用 try 看看
    dengwen168
        5
    dengwen168  
    OP
       2020-04-27 08:20:49 +08:00
    @EricCartmann 想请教一下,django.contrib.comments 发布评论之后,默认跳转到的网址是哪一个?
    我看我的报错是不是网址没有传 resortid,导致没有查到数据,所以出现 Exception Value: list index out of range
    ytmsdy
        6
    ytmsdy  
       2020-04-27 09:02:17 +08:00
    try this.....
    ```
    city_details = Current.objects.filter(resortid = resortid)
    if len(city_details)>0:
    city_name = city_details[0].name
    ```
    ytmsdy
        7
    ytmsdy  
       2020-04-27 09:03:19 +08:00
    ```python
    city_details = Current.objects.filter(resortid = resortid)
    if len(city_details)>0:
    city_name = city_details[0].name
    ```
    triangle111
        8
    triangle111  
       2020-04-27 09:10:53 +08:00
    django 的 filter 方法是从数据库的取得匹配的结果,返回一个对象列表。
    如果记录不存在的话,它会返回[]。所以你这里应该是空列表取第 0 个报的数组越界
    hello2060
        9
    hello2060  
       2020-04-27 09:21:22 +08:00
    放个断点,一步步跟下去就行了,至少 IDE 会告诉你 CRASH 在哪一行吧,你在那行放断点或者把变量都打出来就行了,看看哪个操作用了下标操作。
    Real00
        10
    Real00  
       2020-04-27 09:29:06 +08:00
    我感觉跟楼上的想法差不多
    city_details = Current.objects.filter(resortid = resortid)
    city_name = city_details[0].name
    city_details 的长度如果为空,你取 0 就越界了,这个问题跟 django 无关,不过建议还是熟悉一下 py 的语法再上手框架会比较好
    至于为啥会空,继续深究的话,得看看 resortid 这个值是否存在在数据库了
    johnman
        11
    johnman  
       2020-04-27 11:08:42 +08:00
    filter 如果查不到数据,返回 None,你再操作,当然会报错
    Vegetable
        12
    Vegetable  
       2020-04-27 11:13:50 +08:00   ❤️ 1
    我惊呆了,2020 年了还在看 2013 年的教程?
    甚至这个插件 django 1.6 就分离出去了,教程中还在用 syncdb..
    dengwen168
        13
    dengwen168  
    OP
       2020-04-28 11:59:52 +08:00
    好吧,这个问题终于解决了。
    插件没有任何问题,是我的 url 配置写得不严谨,导致发表评论之后,url 匹配错了,所以才报以上的错误。
    我将这个插件的 url 放到第一行,问题说解决了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:14 · PVG 03:14 · LAX 11:14 · JFK 14:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.