【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

Python64

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。

🌐 推荐一款找工作神器网站: ​​牛客网🎉🎉|笔试题库|面试经验|实习招聘内推 ​​​ 还没账户的小伙伴 ​​​速速点击链接跳转牛客网登录注册​​ 开始刷爆题库,速速通关面试吧🙋‍♂️

该文章收录专栏 ✨---【Django | 项目开发】从入门到上线 专栏---✨

@[toc]

一、产品细节完善

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

1) 设置站点标题,在项目目录下的​ ​url.py​ ​加上如下代码

from django.utils.translation import gettext as _  # 国际化# 国际化 网页标题admin.site.site_header = _('霍格沃兹学院') # 变成key 对于其他语言的value# 国际化 网站标题admin.site.site_title = _('霍格沃兹招聘信息网')

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

2) 填写信息显示提示

  • 添加模型中的​ ​model​​​ ​help_text​
第一轮面试结果first_score = models.DecimalField(max_digits=3, decimal_places=1, blank=True, verbose_name='初始分', null=True,help_text=_('1~5分,非常优秀:>4.5'))

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

3) 将面试官与候选人关联

我们希望能够由HR直接可以下拉选择 面试官所有用户选择,而不能由面试官自己选择。

  • 方法一( 不推荐!

在model 修改原字段类型为 ​ ​foreignkey​​ ( 注意! 此方法会 涉及到数据迁移,此时更改数据结构可能会报错)

  • 方法二 ( 推荐) 保留或者删除原有字段(建议删除,如果删除在&#x200B;<strong>admin.py</strong>&#x200B;显示字段&#x200B;<strong>list_play</strong>&#x200B;也要修改),然后 *添加新的字段做外键的引用
···# 第一轮面试结果first_score = models.DecimalField(max_digits=3, decimal_places=1, blank=True, verbose_name='初始分', null=True,help_text=_('1~5分,非常优秀:>4.5'))first_result = models.CharField(choices=FIRST_INTERVIEW_SCORE_TYPE, blank=True, verbose_name='初始结果', max_length=135)# first_interviewer = models.CharField(max_length=135, blank=True, verbose_name='面试官')first_interviewer_user = models.ForeignKey(User,related_name='first_interviewer_user',on_delete=models.CASCADE,blank=True, verbose_name=_('一面面试官'),null=True)# 第二轮面试结果second_score = models.DecimalField(max_digits=3, decimal_places=1, blank=True, verbose_name='初始分', null=True,help_text=_('1~5分'))second_result = models.CharField(choices=INTERVIEW_RESULT_TYPE, blank=True, verbose_name='复试结果', max_length=135)# second_interviewer = models.CharField(max_length=135, blank=True, verbose_name='面试官')second_interviewer_user = models.ForeignKey(User,related_name='second_interviewer_user',on_delete=models.CASCADE,blank=True, verbose_name=_('二面面试官'),null=True)# HRhr_score = models.DecimalField(max_digits=3, decimal_places=1, blank=True, verbose_name='hr复试得分',null=True,help_text=_('1~5分'))hr_result = models.CharField(choices=HR_SCORE, blank=True, verbose_name='HR结果', max_length=135)# hr_interviewer = models.CharField(max_length=135, blank=True, verbose_name='面试官')hr_interviewer_user = models.ForeignKey(User,related_name='hr_interviewer_user',on_delete=models.CASCADE,blank=True, verbose_name=_('HR'),null=True)···

然后执行数据迁移操作

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

运行服务器

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

4)设置面试官只读权限

在​ &#x200B;admin.py&#x200B;​ 设置如下

······  # empty_value_display = "空" # 没有数据时的显示 默认为 -  # readonly_fields = ('first_interviewer_user',) # in_list_page non-editable and readonly  def get_group_name(self, user):    group_name = []    for g in user.groups.all(): # 循环groups对象列表      group_name.append(g.name) # 附加对象的名字    return group_name  #  # # 设置面试官只读权限  def get_readonly_fields(self, request, obj=None):    # 根据用户得到 该用户所在群组    group_name = self.get_group_name(request.user)    # 如果其为面试官,则返回只读字段    if 'interviewer' in group_name:      logger.info("interview is in the user'group for %s" % request.user.username)      return ('first_interviewer_user', 'second_interviewer_user') # 返回值必须是可迭代对象    return ('',) # 返回值必须是可迭代对象 , 不能返回空

面试官只读

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

5) 设置面试官可直接在列表修改面试官

目前django没有对应的方法​ &#x200B;get_list_editable&#x200B;​,我们需要重写父类方法

def get_group_name(self, user):    group_name = []    for g in user.groups.all():  # 循环groups对象列表      group_name.append(g.name)  # 附加对象的名字    return group_name  # 目前django没有对应的方法  def get_list_editable(self, request):    groups_name = self.get_group_name(request.user)    if request.user.is_superuser or 'hr' in groups_name:      return ('first_interviewer_user', 'second_interviewer_user',)    return ()  # 可直接在页面修改的数据  # 我们需要重写父类方法  def get_changelist_instance(self, request):    """     override admin method and list_editable property value     with values returned by our custom method implementation.    """    self.list_editable = self.get_list_editable(request)  # self 参数在前面的 self.get 就已经指明了    return super(CandidateAdmin, self).get_changelist_instance(request)
  • 面试官
  • 超级管理员或者hr

二、样式美化

1) 美化admin后台

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

pip install django-grappelli
  • 安装后在​ &#x200B;setting.py&#x200B;​进行配置

在添加主题应用时,是需要在其他应用前面的

INSTALLED_APPS = [  'grappelli',  'django.contrib.admin',  'django.contrib.auth',  'django.contrib.contenttypes',  'django.contrib.sessions',  'django.contrib.messages',  'django.contrib.staticfiles',  'jobs',  'interview',······
  • 在项目​ &#x200B;urls.py&#x200B;​​引入​ &#x200B;grappelli&#x200B;​路由
·······  path('grappelli/', include('grappelli.urls')),)·······
  • 效果:

这里的​ &#x200B;'classes': ('collapse',),&#x200B;​分栏隐藏效果失效了

定义集合的字段列表  fieldsets = (    # 第一个元素表示分组展现的名字,第二元素是一个map    (None, {'fields': ("user_id", ("user_name", "email", "gender", "phone",),                       ("apply_position", "degree"),                       ("city", "born_address"),                       ("doctor_school", "bachelor_school", "master_school", "major",),                       ("page_score", "test_score_of_general_ability",                        "candidate_remark",),                       ), }),    ('第一轮面试', {'fields': ("first_score", "first_result", "first_interviewer_user",                          ), 'classes': ('collapse',), "description": '请由面试官输入该信息'}),    ('第二轮面试', {'fields': ("second_score", "second_result", "second_interviewer_user",                          ), 'classes': ('collapse',), "description": '请由面试官输入该信息'}),    ('第三轮面试', {'fields': ("hr_score", "hr_result", "hr_interviewer_user",                          ), 'classes': ('collapse',), "description": '请由面试官输入该信息'})  )

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

2)美化页面

  • 安装三板斧

  • 安装​ &#x200B;bootstrap&#x200B;​​等使用见 -​​官方文档bootstrap3​​​ or​​bootstrap4​

  • 安装​ &#x200B;tailwind&#x200B;​ 模块,详情见参考文献, 这里踩了个大坑!建议直接引入css链接,简单粗暴,安装​ &#x200B;tialwind&#x200B;​模块需要安装导入,初始化,配置模板标签一堆功夫,出了一点错花费时间更多,且出现和现有版本不兼容情况,所以 直接引入链接就好了,简单粗暴!
  • 安装​ &#x200B;django-widget-tweaks&#x200B;​,自定义css样式,配置见参考文献

在tailwind网站找模板下载,自定义配置样式嵌套 ( 注意表单加自定义css需要用到​ &#x200B;widget-tweaks&#x200B;​)

模板地址:​ &#x200B;https://www.tailwindtoolbox.com/starter-templates&#x200B;​​tailwind中文官方文档:​ &#x200B;https://www.tailwindcss.cn/docs/responsive-design&#x200B;

&#x200B;login.html&#x200B;​​ 页面代码,​ &#x200B;signup.html&#x200B;​也是一样的思路


<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>logintitle>

<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/5.13.0/css/all.min.css" rel="stylesheet">


<style>
@import url('https://fonts.googleapis.com/css?family=Karla:400,700&display=swap');

.font-family-karla {
font-family: karla;
}
.forgetpassword{
text-decoration: underline;
}

style>

head>
<body class="bg-white font-family-karla h-screen">
{% load i18n %}
{% load account socialaccount %}
{% load widget_tweaks %}



{% get_providers as socialaccount_providers %}
<div class="w-full flex flex-wrap">


<div class="w-full md:w-1/2 flex flex-col">

<div class="flex justify-center md:justify-start pt-12 md:pl-12 md:-mb-24">
<a href="#" class="bg-black text-white font-bold text-xl p-4">{% trans "recruitment" %}a>
div>

<div class="flex flex-col justify-center md:justify-start my-auto pt-8 md:pt-0 px-8 md:px-24 lg:px-32">
<p class="text-center text-3xl">{% trans "Welcome." %}p>
<form class="flex flex-col pt-3 md:pt-8" method="POST" action="{% url 'account_login' %}" >
{% csrf_token %}


<div class="flex flex-col pt-4">
<label for="login" class="text-lg">{% trans "Login" %}label>
{% render_field form.login class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mt-1 leading-tight focus:outline-none focus:shadow-outline" placeholder=form.login.label id="login" %}

div>

<div class="flex flex-col pt-4">
<label for="Password" class="text-lg">Passwordlabel>
{% render_field form.password class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mt-1 leading-tight focus:outline-none focus:shadow-outline" placeholder=form.password.label id="Password" %}

div>
{{ form.errors.as_text|cut:"__all__"|cut:"*" }}


{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"/>
{% endif %}
<br> <a class="forgetpassword" href="{% url 'account_reset_password' %}">{% trans "Forgot Password? " %}a>
<button class="bg-black text-white font-bold text-lg hover:bg-gray-700 p-2 mt-8" type="submit">{% trans "Log In" %}
button>
form>
<div class="text-center pt-12 pb-12">
<p>{% trans "Don't have an account?" %} <a href="{{ signup_url }}" class="underline font-semibold">{% trans "Register here." %} a>p>
div>
div>
div>

<div class="w-1/2 shadow-2xl">
<img class="object-cover w-full h-screen hidden md:block" src="/static/account/images/photo-1555679427-1f6dfcce943b.jfif">
div>

div>




body>
html>
  • 效果:

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

  • 值得注意一点是: 修改&#x200B;<strong>base.html</strong>&#x200B;模板一定要注意再注意(不然后面样式会像麻花一样乱)

参考文献​​tailwind 安装配置模块(配置npm)​​​​Python 配置tailwind 文档​​​​理解Python虚拟环境​​​​django的表单样式可自定义css​​​​重新继承表单添加部件等方法添加样式​​​​国际化版本项目语言配置​​​​null=true 与 blank=true​

🤞到这里,如果还有什么疑问🤞    🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩      🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳

Original: https://blog.51cto.com/u_15691039/5633447
Author: 计算机魔术师
Title: 【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)



相关阅读1

Title: python编程进阶学习笔记

1. python 一切皆对象

  1. python中的一切皆对象更加彻底
  2. 在python中的一切皆对象比Java中的一切皆对象更加彻底,Java中有class,也就是类的概念,object是class的一个实例。
  3. 函数和类也是对象

1.1 type 、object 和 class 的关系

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

list、str、dict、tuple、type都继承自object,所以object是最底层的(所有类)基类

type是自身的一个实例(通过指针实现),而object、list、str、dict、tuple都是type的对象,所以type创建所有对象

  1. type -> int -> 1 即 type 类生成 int,int 类生成了1
a = 1
print(type(a))   #
print(type(int)) #
  1. type -> str -> 'abc' 所以 type 可以生成 class(类), class 生成 object(对象)
s = 'abc'
print(type(s))        #
print(type(str))      #
  1. type->Student->stu
class Student:
    pass

stu = Student()
print(type(stu))          #
print(type(Student))      #
  1. type -> Student -> stu
class Student:
    pass

#Student继承了最顶层的object同时Student又是type的对象
Student.__bases__         #
print(type(Student))      #

#type是自身的对象,object是type的对象
print(type(type))        #
print(type(object))      #

#type继承了object类,最顶层的object的基类为空
print(type.__bases__)      #
print(object.__bases__)     # ()

1.2 python中对象的三个特征

  1. 身份 / 地址 ( id )
a = 1
print(id(a)) # a 的地址 1493816368
b = []
print(id(b)) # b 的地址 134273344
  1. 类型

常见类型 内容 None(全局只有一个) None 数值 int、float、complex、bool (True / False) 迭代类型 序列 list、bytes、bytearry、memoryview、range、tuple、str、array 映射类型 dict 集合 set、frozenset 上下文管理类型 with 其他 模块类型、class实例、函数类型、方法类型、代码类型、object对象、type类型、ellipsis类型、notimplented类对象

  1. 数值 (变量名 -> 值)

2. 魔法函数

2.1 什么是魔法函数?

&#x6240;&#x8C13;&#x9B54;&#x6CD5;&#x51FD;&#x6570;&#xFF08;Magic Methods&#xFF09;&#xFF0C;&#x662F;Python&#x7684;&#x4E00;&#x79CD;&#x9AD8;&#x7EA7;&#x8BED;&#x6CD5;&#xFF0C;&#x5141;&#x8BB8;&#x4F60;&#x5728;&#x7C7B;&#x4E2D;&#x81EA;&#x5B9A;&#x4E49;&#x51FD;&#x6570;&#xFF08;&#x51FD;&#x6570;&#x540D;&#x683C;&#x5F0F;&#x4E00;&#x822C;&#x4E3A;__xx__&#xFF09;&#xFF0C;&#x5E76;&#x7ED1;&#x5B9A;&#x5230;&#x7C7B;&#x7684;&#x7279;&#x6B8A;&#x65B9;&#x6CD5;&#x4E2D;&#x3002;&#x6BD4;&#x5982;&#x5728;&#x7C7B;A&#x4E2D;&#x81EA;&#x5B9A;&#x4E49;__str__()&#x51FD;&#x6570;&#xFF0C;&#x5219;&#x5728;&#x8C03;&#x7528;str(A())&#x65F6;&#xFF0C;&#x4F1A;&#x81EA;&#x52A8;&#x8C03;&#x7528;__str__()&#x51FD;&#x6570;&#xFF0C;&#x5E76;&#x8FD4;&#x56DE;&#x76F8;&#x5E94;&#x7684;&#x7ED3;&#x679C;&#x3002;
  • 注意

双下划线开头,如: initgetitem 不要尝试自己定义魔法函数 用于增强类的特性 独立存在,定义后不需要显示调用

2.2 python中的魔法函数一览

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

未完待续 ~

Original: https://blog.51cto.com/coderusher/5576249
Author: Coderusher
Title: python编程进阶学习笔记

相关阅读2

Title: 【Django | allauth】登录_注册_邮箱验证_密码邮箱重置

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。

🌐 推荐一款找工作神器网站: ​​牛客网🎉🎉|笔试题库|面试经验|实习招聘内推 ​​​ 还没账户的小伙伴 ​​​速速点击链接跳转牛客网登录注册​​ 开始刷爆题库,速速通关面试吧🙋‍♂️

该文章收录专栏 ✨---【Django | 项目开发】从入门到上线 专栏---✨

一、安装与配置

  • 安装allauth包,
pip install allauth

我们假设你已经创建好了项目 ​ &#x200B;allauthDemo&#x200B;

  • 在setting中引入应用, 由于allauth对站点&#x200B;<strong>django.contrib.sites</strong>&#x200B;​ *有依赖,所以需要加上该应用,并配置站点
... # allauth    'django.contrib.sites',  # first place    'allauth',    'allauth.account',    'allauth.socialaccount',]SITE_ID = 1
  • 在​ &#x200B;setting&#x200B;​对allauth基本配置
# allauth 基本设定ACCOUNT_AUTHENTICATION_METHOD = 'username_email' # 设置用户名和邮箱登录ACCOUNT_EMAIL_REQUIRED = True # 注册需要填写邮箱ACCOUNT_REDIRECT_URL = '/accounts/profile/' # 登录跳转页面AUTHENTICATION_BACKENDS = [    'django.contrib.auth.backends.ModelBackend',    'allauth.account.auth_backends.AuthenticationBackend']

​allauth- configuration配置官方文档​​ 常用配置:

ACCOUNT_AUTHENTICATION_METHOD (="username" | "email" | "username_email"):指定要使用的登录方法(用户名、电子邮件地址或两者之一)ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS (=3):邮件确认邮件的截止日期(天数)ACCOUNT_EMAIL_VERIFICATION (="optional"):注册中邮件验证方法:"强制(mandatory)","可选(optional)"或"否(none)"之一ACCOUNT_EMAIL_CONFIRMATION_COOLDOWN (=180):邮件发送后的冷却时间(以秒为单位)ACCOUNT_LOGIN_ATTEMPTS_LIMIT (=5):登录尝试失败的次数ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT (=300):从上次失败的登录尝试,用户被禁止尝试登录的持续时间ACCOUNT_LOGIN_ON_EMAIL_CONFIRMATION (=False):更改为True,用户一旦确认他们的电子邮件地址,就会自动登录ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE (=False):更改或设置密码后是否自动退出ACCOUNT_LOGIN_ON_PASSWORD_RESET (=False):更改为True,用户将在重置密码后自动登录ACCOUNT_SESSION_REMEMBER (=None):控制会话的生命周期,可选项还有:False,TrueACCOUNT_SIGNUP_EMAIL_ENTER_TWICE (=False):用户注册时是否需要输入邮箱两遍ACCOUNT_SIGNUP_PASSWORD_ENTER_TWICE (=True): 用户注册时是否需要用户输入两遍密码ACCOUNT_USERNAME_BLACKLIST (=[]):用户不能使用的用户名列表ACCOUNT_UNIQUE_EMAIL (=True): 加强电子邮件地址的唯一性ACCOUNT_USERNAME_MIN_LENGTH (=1):用户名允许的最小长度的整数SOCIALACCOUNT_AUTO_SIGNUP (=True):使用从社会帐户提供者检索的字段(如用户名、邮件)来绕过注册表单LOGIN_REDIRECT_URL (="/") 设置登录后跳转链接ACCOUNT_LOGOUT_REDIRECT_URL (="/") 设置退出登录后跳转链接

二、邮箱配置

  • 配置邮箱(这里配置已qq为例)
EMAIL_HOST: 'smtp.qq.com' # 邮件服务器地址EMAIL_POST: 25 #端口号ENAIL_HOST_USER =  '***' #QQ账号EMAIL_HOST_PASSWORD = '*****'  # 授权码或密码(qq是授权码)EMAIL_USE_TLS = True  # 默认DEFAULT_FROM_EMAIL = EMAIL_HOST_USER  # 配置默认发信人

如果不想要邮箱验证可添加配置如下

ACCOUNT_EMAIL_VERIFICATION (="nonel") # 不发送邮箱
  • 在项目的url文件引入​ &#x200B;allauth&#x200B;​​的​ &#x200B;url.py&#x200B;​包
urlpatterns = [    path('admin/', admin.site.urls),    path('accounts/', include('allauth.urls'))]

三、启动服务器运行

  • 三板斧启动服务器(现使用sqlite 数据库,后面再迁移至mysql)
python manage.py makmigrationspython manage.py migratepython manage.py runserver
  • 由于配置好了邮箱,所以 注册邮箱验证以及重置密码部分都是可已正常运行的(有一点注意: 注册好之后,不需要邮箱验证,数据库也会将用户信息存入,邮箱验证只是需要确定邮箱是否正确,不需要验证后才注册成功,这是因为​ &#x200B;ACCOUNT_EMAIL_VERIFICATION (="optonal")&#x200B;​​ 为默认值为可选,如果需要验证才能注册可修改为​ &#x200B;mandatory&#x200B;​)

以下网页都可以正常访问

http://127.0.0.1:8000/accounts/signup/http://127.0.0.1:8000/accounts/login/http://127.0.0.1:8000/accounts/logout/http://127.0.0.1:8000/accounts/password/reset/

四、运行服务器效果

  • signup 注册页面
  • login 页面
  • password/reset 页面
  • email 页面
  • logout页面
  • 邮箱重置密码
  • 注册绑定邮箱验证
  • confirm-email 页面
  • 如果觉得邮箱提示地址​ &#x200B;example.com&#x200B;​​ 名字太丑,还可以在admin 中修改​ &#x200B;display_name&#x200B;

  • 下面是django_allauth所有内置的URLs,均可以访问的。

/accounts/login/(URL名account_login): 登录
/accounts/signup/ (URL名account_signup): 注册
/accounts/password/reset/(URL名: account_reset_password) :重置密码
/accounts/logout/ (URL名account_logout): 退出登录
/accounts/password/set/ (URL名:account_set_password): 设置密码
/accounts/password/change/ (URL名: account_change_password): 改变密码(需登录)
/accounts/email/(URL名: account_email) 用户可以添加和移除email,并验证
/accounts/social/connections/(URL名:socialaccount_connections): 管理第三方账户

  • 你有没有注意到没有/accounts/profile/这个URL?如果我们希望用户在注册时提供更多信息怎么办(比如公司名和电话)? 如果我希望用户在登录后跳转到个人信息页面(UserProfile),并允许用户修改个人信息怎么办?因为每个开发者对用户所需提供的额外信息需求都不是一样的,所以django-allauth没有提供这个视图和URL。

【Django | 开发】面试招聘信息网站(处理产品细节和权限&美化页面样式)

参考文献: ​​allauth登录注册与邮箱验证​​​ ​​​django发送邮箱​​​ ​​​扩展用户自带user模型(非allauth实现)​​​ ​​​外键related_name​​​ ​​​def _ str_ (self)​​​ ​​​def _ str_ (self)​​​ ​​​verbose_name​​​ ​​​admin自定模型​

Original: https://blog.51cto.com/u_15691039/5632003
Author: 计算机魔术师
Title: 【Django | allauth】登录_注册_邮箱验证_密码邮箱重置

相关阅读3

Title: 字符串的应用-

1.2.1 string.isspace() 如果string中只包含空格,则返回true

1.2.2 string.isalnum() 如果string至少有一个字符并且所有字符都是字母或者数字则返回true

1.2.3 string.isalpha() 如果string至少有一个字符并且所有字符都是字母则返回True

1.2.4 string.isdecima() 如果string只包含数字则返回True,全角数字

1.2.5 string.isdight() 如果string只包含数字则返回True,全角数字,(1),\u00b2

1.2.6 string.isnumeric() 如果string只包含数字则返回True,全角数字,汉子数学

1.2.7 string.istitle() 如果string是标题化的(每个单词的首字母大写)则返回True

1.2.8 string.islower() 如果string中包含至少一个区分大小写字母,并且字母都是小写,则返回True

1.2.9 string.isupper() 如果string中包含至少一个区分大小写字母,并且字母都是大写,则返回True

string中只包含空格,则返回true

string.isspace()
test_str = " "
print(test_str.isspace())

string至少有一个字符并且所有字符都是字母或者数字则返回true

string.isalnum()
test_str = " aa123AA \t\n\r"
print(test_str.isalnum())

string至少有一个字符并且所有字符都是字母则返回True

string.isalpha()
test_str = " aaaaa\t"
print(test_str.isalpha())

数字的不同表达形式

string.isdecima()  &#x5982;&#x679C;string&#x53EA;&#x5305;&#x542B;&#x6570;&#x5B57;&#x5219;&#x8FD4;&#x56DE;True,&#x5168;&#x89D2;&#x6570;&#x5B57;
string.isdight()   &#x5982;&#x679C;string&#x53EA;&#x5305;&#x542B;&#x6570;&#x5B57;&#x5219;&#x8FD4;&#x56DE;True,&#x5168;&#x89D2;&#x6570;&#x5B57;,(1),\u00b2
string.isnumeric() &#x5982;&#x679C;string&#x53EA;&#x5305;&#x542B;&#x6570;&#x5B57;&#x5219;&#x8FD4;&#x56DE;True,&#x5168;&#x89D2;&#x6570;&#x5B57;,&#x6C49;&#x5B50;&#x6570;&#x5B66;
test_str = "123456&#x4E00;&#x58F9;&#x4E8C;&#x4E09;"
print(test_str.isdecimal())    # fales
print(test_str.isdigit())      # false
print(test_str.isnumeric())    # true

string是标题化的(每个单词的首字母大写)则返回True

string.istitle()
test_str = "Abc Bcd Efg"
print(test_str.istitle())

字母的表达方式

string.islower()   &#x5982;&#x679C;string&#x4E2D;&#x5305;&#x542B;&#x81F3;&#x5C11;&#x4E00;&#x4E2A;&#x533A;&#x5206;&#x5927;&#x5C0F;&#x5199;&#x5B57;&#x6BCD;,&#x5E76;&#x4E14;&#x5B57;&#x6BCD;&#x90FD;&#x662F;&#x5C0F;&#x5199;,&#x5219;&#x8FD4;&#x56DE;True
string.isupper()   &#x5982;&#x679C;string&#x4E2D;&#x5305;&#x542B;&#x81F3;&#x5C11;&#x4E00;&#x4E2A;&#x533A;&#x5206;&#x5927;&#x5C0F;&#x5199;&#x5B57;&#x6BCD;&#xFF0C;&#x5E76;&#x4E14;&#x5B57;&#x6BCD;&#x90FD;&#x662F;&#x5927;&#x5199;,&#x5219;&#x8FD4;&#x56DE;True
test_str = "ABC BCD EFG"
print(test_str.islower())    # false
print(test_str.isupper())    # true

判断是否以a开头

startswith
test_str = 'aaaa.jpg'
print(test_str.startswith('a'))

判断是否以jpg结尾

endswith
test_str = 'aaaa.jpg'
print(test_str.endswith('jpg'))

文件长度小于6并且后缀匹配正常,则随机选择6位数进行替换,反之,文件长度大于6并且后缀正常,则上传成功


import random
file = input("&#x8BF7;&#x8F93;&#x5165;&#x6587;&#x4EF6;&#x540D;&#x8BCD;: ")
i = file.rfind('.')
fileName = file[:i]
fileExtension = file[i+1:]
if len(fileName) >= 6 and [file.endswith("jpg") or file.endswith("png") or file.endswith("pnf")]:
    print('&#x4E0A;&#x4F20;&#x6210;&#x529F;%s' % file)
elif len(fileName) < 6 and file.endswith("jpg") or file.endswith("png") or file.endswith("pnf"):
    # &#x83B7;&#x53D6;&#x968F;&#x673A;&#x6570;
    fileName = ''
    str1 = 'abcdewqwhjbkll;kjkbjhkloibnghv,./123465789csabkjcksdvnkdsvmvl'
    for i in range(6):
        strIndex = random.randint(0, len(str1) - 1)
        fileName += str[strIndex]
    print(fileName+"."+fileExtension)
else:
    print("null")

熟悉字符判断信息


userName = input('&#x8BF7;&#x8F93;&#x5165;&#x4F60;&#x7684;&#x7528;&#x6237;&#x540D;: ')
userPhone = input('&#x8BF7;&#x8F93;&#x5165;&#x4F60;&#x7684;&#x624B;&#x673A;&#x53F7;: ')

if (userName.islower() and userName.isalpha() and len(userName) >= 6) or (userPhone.isdigit() and len(userPhone) == 11 and userPhone.startswith('158')):
    print("&#x8D26;&#x53F7;&#x6216;&#x8005;&#x624B;&#x673A;&#x53F7;&#x9A8C;&#x8BC1;&#x6210;&#x529F;")
    userPwd = input('&#x8BF7;&#x8F93;&#x5165;&#x4F60;&#x7684;&#x5BC6;&#x7801;: ')
    if len(userPwd) >= 6:
        print('&#x7528;&#x6237;&#x662F;%s,&#x624B;&#x673A;&#x53F7;&#x7801;&#x662F;%s,&#x5BC6;&#x7801;&#x662F;%s' % (userName, userPhone, userPwd))
        if (userName == "admin123" and userPwd == 200325) or (userPhone == "15824983170" and userPwd == 200325):
            print("&#x767B;&#x9646;&#x6210;&#x529F;")
        else:
            print("&#x767B;&#x9646;&#x5931;&#x8D25;")
else:
    print("&#x8D26;&#x53F7;&#x6216;&#x8005;&#x624B;&#x673A;&#x53F7;&#x9519;&#x8BEF;")

Original: https://www.cnblogs.com/liangyuxing/p/16156107.html
Author: HXX-LYX
Title: 字符串的应用-