diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsButtonsWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsButtonsWidget.php
index 4bcaaa9..2877480 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsButtonsWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsButtonsWidget.php
@@ -37,6 +37,11 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
     $options = $this->getOptions($items->getEntity());
     $selected = $this->getSelectedOptions($items);
 
+    // Do not display the widget if there are no settable options.
+    if (!$this->hasSettableOptions($options)) {
+      return [];
+    }
+
     // If required and there is one single option, preselect it.
     if ($this->required && count($options) == 1) {
       reset($options);
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsSelectWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsSelectWidget.php
index b846988..8a72f95 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsSelectWidget.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsSelectWidget.php
@@ -34,9 +34,16 @@ class OptionsSelectWidget extends OptionsWidgetBase {
   public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
     $element = parent::formElement($items, $delta, $element, $form, $form_state);
 
+    $options = $this->getOptions($items->getEntity());
+
+    // Do not display the widget if there are no settable options.
+    if (!$this->hasSettableOptions($options)) {
+      return [];
+    }
+
     $element += array(
       '#type' => 'select',
-      '#options' => $this->getOptions($items->getEntity()),
+      '#options' => $options,
       '#default_value' => $this->getSelectedOptions($items),
       // Do not display a 'multiple' select box if there is only one option.
       '#multiple' => $this->multiple && count($this->options) > 1,
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php
index a902921..bb52d74 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/OptionsWidgetBase.php
@@ -200,4 +200,17 @@ protected function sanitizeLabel(&$label) {
    */
   protected function getEmptyLabel() { }
 
+  /**
+   * Checks if the options array contains any settable values.
+   *
+   * @param array $options
+   *   The array of options for the widget.
+   *
+   * @return bool
+   *   TRUE if the options array contains any settable values, FALSE otherwise.
+   */
+  protected function hasSettableOptions(array $options = []) {
+    return ((count($options) > 1) || (count($options) == 1 && key($options) != '_none'));
+  }
+
 }
