DJango 教程 http://www.liujiangblog.com/course/
1. 服务启动后,其他机器无法访问
DisallowedHost at /polls/
Invalid HTTP_HOST header: '192.168.10.189:8000'. You may need to add '192.168.10.189' to ALLOWED_HOSTS.
需要修改settings.py中的 ALLOWED_HOSTS = [] 为 ALLOWED_HOSTS = [‘*’], 这样就允许其他机器访问了
2. 连接mysql数据库报错,已经安装了pymysql
django2.2/mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3
解决办法 https://blog.csdn.net/weixin_33127753/article/details/89100552
3. 当因为使用的ImageField后,导致出现
File "/usr/lib/pymodules/python2.6/django/db/models/fields/files.py" in update_dimension_fields
368. (self.width_field and not getattr(instance, self.width_field))
Exception Type: TypeError at /admin/proj/userprofile/add/
Exception Value: getattr(): attribute name must be string
models.ImageField(upload_to='uploads/%Y/%m/%d/') 使用这种方式可以工作,不要带width和height参数(原因看下面的文章,没读懂o(╥﹏╥)o)
4。 图片文件从后台上传后,却无法显示的问题 (直接打开图片链接,图片无法显示)
注意对于django2.x,路由表使用path或者re_path, 旧版本用url
https://www.cnblogs.com/52forjie/p/7875875.html
https://www.cnblogs.com/cpl9412290130/p/9611293.html
5. 理解路由中的命名空间
在polls这个app的urls.py这个文件中,我们通常这样定义一条路由
app_name = "polls"
urlpatterns = [
#...
path('articles/<int:year>/', views.year_archive, name='news-year-archive'),
#...
]
name='news-year-archive', 给出这样一个名字,是为了当我们在代码或html中使用这个路由地址时,不进行硬编码。
一个项目中可能包含多个app,这样就无法完全避免在不同的app中出现相同的路由名称的问题。 所以我们需要命名空间来明确我们需要的路由地址是哪个,例如在html中我们可以用 polls:news-year-archive 来明确指定。
根据路由名字获取整个url的时候,我们需要借助django提供的函数:
在模板语言中,使用url标签, 例如 {% url 'news-year-archive' yearvar %}
在python代码中,我们用reverse()函数
在模型中,使用get_absolute_url()函数
上面的app_name = "polls"就是定义了polls这个名字空间。 这不是很好理解吗?
其实,我们还可能面临另一个问题:两套不同的路由使用同一套view。看下面的例子,在根路由文件中:
urlpatterns = [
path('author-polls/', include('polls.urls', namespace='author-polls')),
path('publisher-polls/', include('polls.urls', namespace='publisher-polls')),
]
我们可以看到,uthor-polls/和publisher-polls/这2条路由都将请求传入了polls.urls,那就意味着这2条路由会使用相同的view进行处理。 那view处理中生成html时,html中的链接地址如何生成呢? 因为传入polls.urls中的地址,已经去掉了uthor-polls/和publisher-polls/,所以无法从地址上区分是从那条路由进来的数据。
我们可以通过author-polls和publisher-polls这两个命名空间,例如publisher-polls:news-year-archive
这个样就存在3个命名空间了啊,他们什么关系?
其实app_name = "polls"定义的是项目名称,namespace='author-polls'和namespace='publisher-polls'定义的是项目实例的名称。这样是不是好理解写了。 下面看看是怎么个用法。
实际使用过程中,我们通常使用项目名称来作为命名空间 polls:news-year-archive,来进行定位。 程序运行过程中,在view中调用reverse函数时,这个函数可以带第三个参数:
reverse('pollsnew:results', args=(question.id,),current_app=request.resolver_match.namespace)
current_app=request.resolver_match.namespace的作用是获取当前的请求来自哪个项目实例,如果不写这个参数,那么将使用项目注册的最后一个实例,本例中就是publisher-polls
还有一个特殊情况,就是实例的命名空间与项目的命名空间相同,那么这时,如果不带current_app这个参数,那么这个实例就将作为当前的实例:
path('author-polls/', include('polls.urls', namespace='polls')),
参考:https://www.cnblogs.com/olivertian/p/10974281.html
6. Django模板语法概要
DjangoTemplates简称DTL,一共包括了4种语法结构
- 变量:来自于render对象的content参数,它是个数据字典,例如 {'first_name': 'John', 'last_name': 'Doe'}。 这时我们就可以通过如下的方式访问变量:{{ first_name }} 。 另外字典查询,属性查询和列表查询都是通过圆点实现的:
{{ my_dict.key }} {{ my_object.attribute }} {{ my_list.0 }}
- 标签: 类似于python中的函数,可以输出内容,控制结构等,且大部分标签可以接收参数,有些标签需要配套使用起始标签和闭合标签
{% cycle 'odd' 'even' %} # 循环使用'odd'和'even' {% if user.is_authenticated %} Hello, {{ user.username }}. {% endif %}
- 过滤器:用于修改变量或者标签参数的值
输入是{'django': 'the web framework for perfectionists with deadlines'} {{ django|title }} # 输出为The Web Framework For Perfectionists With Deadlines {{ my_date|date:"Y-m-d" }} # 按指定的格式"Y-m-d",显示日期
7. 表单中的绝对路径和相对路径
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>
如果当前路径为http://192.168.10.189:8000/polls/, 那么数据将被提交给http://192.168.10.189:8000/your-name/
<form action="your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit" />
</form>
如果当前路径为http://192.168.10.189:8000/polls/, 那么数据将被提交给http://192.168.10.189:8000/polls/your-name/
注意action的值中的第一个字符