DJango学习中遇到的问题

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)

解决方式:https://stackoverflow.com/questions/1683362/getattr-attribute-name-must-be-string-error-in-admin-panel-for-a-model-with

 

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种语法结构
  1. 变量:来自于render对象的content参数,它是个数据字典,例如 {'first_name': 'John', 'last_name': 'Doe'}。 这时我们就可以通过如下的方式访问变量:{{ first_name  }} 。 另外字典查询,属性查询和列表查询都是通过圆点实现的:
    {{ my_dict.key }}
    {{ my_object.attribute }}
    {{ my_list.0 }}
  2. 标签: 类似于python中的函数,可以输出内容,控制结构等,且大部分标签可以接收参数,有些标签需要配套使用起始标签和闭合标签
    {% cycle 'odd' 'even' %} # 循环使用'odd'和'even'
    
    {% if user.is_authenticated %}
    Hello, {{ user.username }}.
    {% endif %}

     

  3. 过滤器:用于修改变量或者标签参数的值
    输入是{'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的值中的第一个字符

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值