Django问题合集

在做一些django小项目时遇到的一些问题
1.获得的POST无法使用[]取出键值对的值列表里面所有值怎么办?

因为该列表时Queryset,所以[]重载
QueryDict.__getitem__(key)
  返回给出的 key 的值。如果key 具有多个值,__getitem__() 返回最后(最新)的值。如果 key 不存在,则引发错误
QueryDict.values()
  类似标准字典的values() 方法,但是它使用的是和__getitem__ 一样返回最新的值的逻辑。也就是返回一个所有键对应的最新值的列表。
即我们使用getlist
QueryDict.getlist(key, default)
  以Python 列表形式返回所请求的键的数据。如果键不存在并且没有提供默认值,则返回空列表。它保证返回的是某种类型的列表,除非默认值不是列表。
QueryDict.setlist(key, list_)
  为给定的键设置list(与__setitem__() 不同),可以设置一个多元素的列表。
QueryDict.lists()
  类似items,只是它将字典中的每个成员作为列表。也就是说,列表中的每个元素,都是由键和对应的值列表组成的二元元祖。

2.HTML中如何使用多对多取值?

html中

{% for book in book_list %}
    <tr>
        <td>{{ book.nid }}</td>
        <td>{{ book.title }}</td>
        <td>{{ book.price }}</td>
        <td>{{ book.publishDate }}</td>
        <td>{{ book.publish.name }}</td>
        <td>
            {% for author in book.authors.all %}
                {{ author.name }}
            {% endfor %}
        </td>
        <td>
            <button class="btn btn-succeed">编辑</button>
            <button class="btn btn-danger">删除</button>
        </td>
    </tr>

view.py中

def bms(request):
    book_list = Book.objects.all()
    print(Book.authors)
    return render(request,"index.html",{"book_list":book_list})

print(book_obj.first().authors)打印出来为none
print(book_obj.first().authors.all().values("name"))打印出来为queryset列表

3.使用ORM不能显示时间
<div class="form-group">
    <label for="publishDate" class="col-sm-2 control-label">出版日期</label>
    <div class="col-sm-10">
        <input type="date" id="publishDate" class="form-control" name="publishDate" required value="{{ book.publishDate|date:"Y-m-d" }}">
    </div>
</div>

这时候,我使用value="{{ book.publishDate|date:"Y-m-d" }}过滤器,将数据库传来的时间格式化成指定格式即可

4.if 条件判断相等
{% if 1== 1%}
<p>这个标签在django里面执行不了</p>
{% endif%}
应该改用
{% ifequal 1  1 %}
    <p>这个标签在django里面可以执行</p>
{% endifequal %}

注意:在if标签内判断相等不能使用==双等于,一定要使用{% ifequal %}标签

5.修改表记录

book_obj.authors.remove() # 将某个特定的对象从被关联对象集合中去除,可以使用book_obj.authors.remove(*[])
book_obj.authors.clear() #清空被关联对象集合
book_obj.authors.set() #先清空再设置

这几个函数针对对象设置,而不是queryset设置

上面都是一个参数一个参数的传,比如set(),设置值时传入列表

而update()对象不能调用,只能用queryset调用
delete()对象和queryset都能调用

6.刷新按钮

<a href="" class="">刷新</a>
href属性中不指定值,则代表刷新

7.RecursionError: maximum recursion depth exceeded

python递归到最大层次,1000层

8.ajax设置url,触发后找不到网页

设置urls时,必须在路径后面加/(ajax中的url和django中urls都要这样)

9.Uncaught SyntaxError: Unexpected identifier

js语法错误,好好检查语法

10.django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.Did you install mysqlclient?

django的python3使用MYSQLdb库时会报错,解决办法

import pymysql
pymysql.install_as_MySQLdb()
11.model.py中的模型层,中的类没有继承models.Model

示例

class Userinfo(models.Model):
    nid = models.AutoField(primary_key=True)
    user = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
12.报错SystemCheckError: System check identified some issues:
ERRORS:
auth.User.groups: (fields.E304) Reverse accessor for 'User.groups' clashes with reverse accessor for 'UserInfo.groups'.
        HINT: Add or change a related_name argument to the definition for 'User.groups' or 'UserInfo.groups'.
auth.User.user_permissions: (fields.E304) Reverse accessor for 'User.user_permissions' clashes with reverse accessor for 'UserInfo.user_permissions'.
        HINT: Add or change a related_name argument to the definition for 'User.user_permissions' or 'UserInfo.user_permissions'.
blog.UserInfo.groups: (fields.E304) Reverse accessor for 'UserInfo.groups' clashes with reverse accessor for 'User.groups'.
        HINT: Add or change a related_name argument to the definition for 'UserInfo.groups' or 'User.groups'.
blog.UserInfo.user_permissions: (fields.E304) Reverse accessor for 'UserInfo.user_permissions' clashes with reverse accessor for 'User.user_permissions'.
        HINT: Add or change a related_name argument to the definition for 'UserInfo.user_permissions' or 'User.user_permissions'.

如果我们继承AbstractUser

from django.contrib.auth.models import User,AbstractUser
class UserInfo(AbstractUser):
    nid = models.AutoField(primary_key=True)
telephone = models.CharField(max_length=11,null=True,unique=True)
avatar = models.FileField(upload_to="avatars/",default="avatars/default.png")
create_time = models.DateTimeField(verbose_name="创建时间",auto_now_add=True)

blog = models.OneToOneField(to="blog",to_field="nid",null=True,on_delete=True)

def __str__(self):
    return self.username

就必须在setting.py里面设置继承类
AUTH_USER_MODEL = "blog.UserInfo"
使用AUTH_USER_MODEL变量,设置值为 应用名.类名

13.给form表单中的按钮设置单击事件后,使用ajex发送数据,但是一直不是使用ajax提交,而是form提交方式?

原因:form表单中在没有指定type的按钮,将自动被视为submit提交表单的功能,使用form方法。
解决办法:方式一:给按钮加一个别的type属性(取消默认type=“submit”),可以是type=“button”
方式二:将按钮移到form外

14.使用kindeeditor后,textarea使用val()取不到值?

官方有解决办法
KindEditor的可视化操作在新创建的iframe上执行,代码模式下的textarea框也是新创建的,所以最后提交前需要执行 sync() 将HTML数据设置到原来的textarea
KindEditor在默认情况下自动寻找textarea所属的form元素,找到formonsubmit事件里添加editor.sync()函数,所以用form方式提交数据,不需要手动执行editor.sync()函数。
// 将编辑器的HTML数据同步到textarea
editor.sync();

简单说:
取值前使用editor.sync();后再使用val()取值

15.smtplib.SMTPServerDisconnected: Connection unexpectedly closed

没有配置
EMAIL_USE_SSL = True #465端口

注意:25端口发邮件使用EMAIL_USE_TLS = True#25
465端口发邮件使用EMAIL_USE_SSL = True

16. pymysql.err.IntegrityError: (1062, "Duplicate entry ‘7-7’ for key
dango显示
pymysql.err.IntegrityError: (1062, "Duplicate entry '7-7' for key 'blog_articleupdown_article_id_user_id_fa3d0c08_uniq'")
js显示
POST http://127.0.0.1:8000/digg/ 500 (Internal Server Error)

原因:
在一张表中插入相同的数据,也就是说,这个数据已经存在,进行插入这条数据会报错
做博客项目中,对点赞表已经有的记录,下次插入相同数据时,会报错
解决办法:
删除原来的那记录

17.ValueError: Database returned an invalid datetime value. Are time zone definitions for your database installed?

时差配置出现问题
修改配置中TIME_ZONE可以修改默认时区即可

TIME_ZONE = "Asia/Shanghai"  
USE_TZ = False  
LANGUAGE_CODE = 'zh-hans'  
18.TypeError at /admin/blog/article/add/ str returned non-string (type method_descriptor)

这个错误代表上面类的__str__方法返回的值为空,不是一个字符串类型
我们需要排查目标类下面的__str__方法

def __str__(self):
    return self.title
19.一对多填加记录时,使用add方法报错

因为不含外键的对象访问含外键的对象,需要加_set,故根据django官方文档所述
从含外键的对象添加不含外键的对象,直接像添加普通字段一样。相反要用对象.add()方法
比如:文章分类表和文章表,一对多关系。在文章表中添加外键ForeignKey
文章表添加分类只要像添加普通字段一样;文章分类表添加文章时使用add()方法 .
add()只能传入对象,不能传入对象pk

官方示例

add(*objs, bulk=True)¶
Adds the specified model objects to the related object set.
Example:
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.add(e) # Associates Entry e with Blog b.

remove(* objs,bulk = True)
Removes the specified model objects from the related object set:
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.remove(e) # Disassociates Entry e from Blog b.

clear(bulk=True)¶
Removes all objects from the related object set:
>>> b = Blog.objects.get(id=1)
>>> b.entry_set.clear()

set(objs, bulk=True, clear=False)¶
Replace the set of related objects:
>>> new_list = [obj1, obj2, obj3]
>>> e.related_set.set(new_list)  

注意
需要注意的是add(),create(),remove(),clear(),和set()所有立即应用数据库更改为各类相关领域。换句话说,没有必要调用save() 关系的任何一端。
此外,如果你正在使用一个中间模型的许多一对多的关系,那么 add(),create(),remove(),和set()方法是禁用的。
更新_set里面的内容时,使用set时必须要传入一个含有对象的列表

20.TypeError: ‘NoneType’ object is not callable

关联字段的on_delete对象不要设置为null,否则会报这个错,如果想要设置改用
on_delete=models.SET_NULL

21.解决外部js使用django模板变量

当我们把行内js转变为外接样式时,单独导入文件存js变量时,不能直接使用模板变量
在HTML中使用<script></script>标签将后台传递的数据渲染成JS对象,然后JS代码中则可以直接使用这个对象了。

<script>
var MyViewVar = {
 var_1: {{ var_1 }},
 var_2: {{ var_2 }},
};
</script>

将其变为对象
在外接js中只要使用MyViewVar.var_1MyViewVar.var_2即可访问这两个变量

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值