mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Closes #8779: Enable the use of ChoiceSet by plugins
This commit is contained in:
@ -109,3 +109,70 @@ The example above will enable export templates and tags, but no other NetBox fea
|
||||
::: netbox.models.features.TagsMixin
|
||||
|
||||
::: netbox.models.features.WebhooksMixin
|
||||
|
||||
## Choice Sets
|
||||
|
||||
For model fields which support the selection of one or more values from a predefined list of choices, NetBox provides the `ChoiceSet` utility class. This can be used in place of a regular choices tuple to provide enhanced functionality, namely dynamic configuration and colorization.
|
||||
|
||||
To define choices for a model field, subclass `ChoiceSet` and define a tuple named `CHOICES`, of which each member is a two- or three-element tuple. These elements are:
|
||||
|
||||
* The database value
|
||||
* The corresponding human-friendly label
|
||||
* The assigned color (optional)
|
||||
|
||||
!!! note
|
||||
Authors may find it useful to declare each of the database values as constants on the class, and reference them within `CHOICES` members. This convention allows the values to be referenced from outside the class, however it is not strictly required.
|
||||
|
||||
### Dynamic Configuration
|
||||
|
||||
To enable dynamic configuration for a ChoiceSet subclass, define its `key` as a string specifying the model and field name to which it applies. For example:
|
||||
|
||||
```python
|
||||
from utilities.choices import ChoiceSet
|
||||
|
||||
class StatusChoices(ChoiceSet):
|
||||
key = 'MyModel.status'
|
||||
```
|
||||
|
||||
To extend or replace the default values for this choice set, a NetBox administrator can then reference it under the [`FIELD_CHOICES`](../../configuration/optional-settings.md#field_choices) configuration parameter. For example, the `status` field on `MyModel` in `my_plugin` would be referenced as:
|
||||
|
||||
```python
|
||||
FIELD_CHOICES = {
|
||||
'my_plugin.MyModel.status': (
|
||||
# Custom choices
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
### Example
|
||||
|
||||
```python
|
||||
# choices.py
|
||||
from utilities.choices import ChoiceSet
|
||||
|
||||
class StatusChoices(ChoiceSet):
|
||||
key = 'MyModel.status'
|
||||
|
||||
STATUS_FOO = 'foo'
|
||||
STATUS_BAR = 'bar'
|
||||
STATUS_BAZ = 'baz'
|
||||
|
||||
CHOICES = (
|
||||
(STATUS_FOO, 'Foo', 'red'),
|
||||
(STATUS_BAR, 'Bar', 'green'),
|
||||
(STATUS_BAZ, 'Baz', 'blue'),
|
||||
)
|
||||
```
|
||||
|
||||
```python
|
||||
# models.py
|
||||
from django.db import models
|
||||
from .choices import StatusChoices
|
||||
|
||||
class MyModel(models.Model):
|
||||
status = models.CharField(
|
||||
max_length=50,
|
||||
choices=StatusChoices,
|
||||
default=StatusChoices.STATUS_FOO
|
||||
)
|
||||
```
|
||||
|
Reference in New Issue
Block a user