一个在IT行业摸爬打滚的程序猿

0%

django踩坑记录(3)

0x0a、如何设置后台管理的标题、copyright、换肤功能(这个是基于xadmin的)

可以通过在任何一个app里面的adminx里面增加下面这些代码即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class GlobalSettings(object):
"""设置后台管理系统的名字及页底的copyright"""
site_title = "慕学后台管理系统"
site_footer = "慕学在线网"


class BaseSettings(object):
"""设置Django换肤功能"""
enable_themes = True
use_bootswatch = True


xadmin.site.register(xadmin.views.CommAdminView, GlobalSettings)
xadmin.site.register(xadmin.views.BaseAdminView, BaseSettings) # 这两个千万别打错、别继承错,不然就是设置无效

设置自定义的页面属性,后台管理显示的字段,copyright,换肤功能

0x0b、Django前端路由的注意事项
  1. 路由加“/”和不加的区别:
    1
    2
    3
    4
    5
    6
    7
    # 情况1
    path('login/', TemplateView.as_view(template_name="login.html"), name="login")



    # 情况2
    path('login', TemplateView.as_view(template_name="login.html"), name="login")
字段 结果
情况1 前端访问http://127.0.0.1:8000/login/或者http://127.0.0.1:8000/login这个地址都是可以找的到的
情况2 只能访问http://127.0.0.1:8000/login;不能访问http://127.0.0.1:8000/login/
  1. 顺带说一下,Django提供了一个很方便的使用方法,可以减少后期的维护工作量,方便开发者随意变更url地址(即便如此,也希望各位尽量少变更,避免出现异常/未全部同步更改的情况)
1
2
3
4
5
# 情况3
path('login/', TemplateView.as_view(template_name="login.html"), name="login")

# 情况4
path('login/', TemplateView.as_view(template_name="login.html"))

情况3和情况4其实就是在于name="login",你可以理解为,在这里为这个url的地址额外添加一个名字,这个名字就是叫”login”,然后你每次叫这个名字的时候,其实都是叫他前面填的这个”login/“。

然后在前端页面里面,这样来使用这个url的名字,就可以做到不用写死url了,方便后期的维护

1
<a style="color:white" class="fr loginbtn" href="{% url 'login' %}">登录</a>

例如:你想修改登录的url为http://127.0.0.1:8000/login23/,那么你只需要修改代码为path('login23/', TemplateView.as_view(template_name="login.html"), name="login")即可达到你的目的

0x0c、自定义form表单校验数据(继承Django的form来书写)

如用户的登录操作,可以定义得以一个form来校验

1
2
3
4
5
6
7
from django import forms


class LoginForm(forms.Form):
"""继承Django默认的form"""
username = forms.CharField(required=True, min_length=3)
password = forms.CharField(required=True, min_length=6)

使用方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from users.forms import LoginForm

login_form = LoginForm(request.POST)
if login_form.is_valid():
username = login_form.cleaned_data["username"] # 重点是这种用法,是这样从form里面提取对应字段的值
password = login_form.cleaned_data["password"]

user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return HttpResponseRedirect(reverse("index"))
else:
return render(request, "login.html", {"msg": "用户名或者密码错误", "login_form": login_form})
else:
return render(request, "login.html", {"login_form": login_form}) # 这个会自动校验,并且将错误的信息返回

如果校验失败,那么返回的login_form字段里面带有下面这种用法的:

1
2
3
4
5
6
7
{% if login_form.errors %}
{% for key,error in login_form.errors.items %}
{{ error }}
{% endfor %}
{% else %}
{{ msg }}
{% endif %}

就是可以直接提取/使用错误信息,直接返回到前端展示。

与此同时,还能够将前端的输入框做校验,选中提示是哪个字段出现异常,详情请看下边的完整的form表单的代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
<form class="tab-form" action="{% url 'login' %}" method="post" autocomplete="off" id="form1">
<div class="form-group marb20 {% if login_form.errors.username %}errorput{% endif %}">
<input name="username" id="account_l" value="{{ login_form.username.value }}" type="text" placeholder="手机号/邮箱" />
</div>
<div class="form-group marb8 {% if login_form.errors.password %}errorput{% endif %}">
<input name="password" id="password_l" value="{{ login_form.password.value }}" type="password" placeholder="请输入您的密码" />
</div>
<div class="error btns login-form-tips" id="jsLoginTips">{% if login_form.errors %}{% for key,error in login_form.errors.items %}{{ error }}{% endfor %}{% else %}{{ msg }}{% endif %}
</div>
<div class="auto-box marb38"><a class="fr" href="forgetpwd.html">忘记密码?</a></div>
<input class="btn btn-green" id="jsLoginBtn" type="submit" value="立即登录 > " />
{% csrf_token %}
</form>
感谢认真读完这篇教程的您

先别走呗,这里有可能有你需要的系列文章:

Django踩坑记录系列