Updates to Popover and CSS Anchor Positioning Polyfills
hint
popovers, position-area
and more
We have been busy updating the Popover and CSS Anchor Positioning Polyfills, but there is still more we can do with your help.
(None of them is the username)
The term “username” is ambiguous. When designing a user model there are several kinds of names that are useful to include.
It’s time to start a new project. You want users, so the first thing you do is add a user model with username and password fields and – whoa, hold up.
What’s that username again? Is it the user’s email address? Is it an arbitrary nickname that the user can choose? Is it an automatically generated identifier that should never change?
It’s not for nothing that they say naming things is one of the hard problems in computer science. For modeling user accounts there are three different name fields that you probably want, and for the sake of avoiding confusion let’s not call any of them the username:
You probably noticed I did not include the user’s given and family names (and middle name and maiden name and…). Avoid collecting these as separate fields unless you need to, i.e. for official or legal purposes. Keep in mind that the preferred order of these names varies in different cultures (so avoid calling them “first name” and “last name”). And keep in mind that they may change over time. Names are hard.
We like Django for building backends. There are a number of ways to
extend Django’s default user model. Here’s our custom User
model that
meets the above guidelines:
from django.db import models
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.base_user import AbstractBaseUser
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField("email address", unique=True)
name = models.CharField("name", max_length=30, blank=True, unique=True)
date_joined = models.DateTimeField(_("date joined"), auto_now_add=True)
is_active = models.BooleanField(_("active"), default=True)
objects = UserManager()
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
def get_full_name(self):
return self.name
def get_short_name(self):
return self.name
Like all Django models, it has a default id
field which meets our
criteria for user id. There is a single name
field which is used
when Django needs to display the user’s name via the get_full_name
and
get_short_name
methods. And it has an email
field which enforces
uniqueness and is configured as Django’s USERNAME_FIELD (which is
really the login).
(Note: This model requires a custom UserManager
– I won’t include that
here; see Vitor Freitas’ helpful How to Extend the Django User Model
article for details.)
Add this model to a new Django project (it’ll be easiest if you use it from the start), configure it using the AUTH_USER_MODEL setting, and you’ll be well on your way to never having to say the word “username” again.
Did we miss anything important? Let us know via Twitter!
hint
popovers, position-area
and more
We have been busy updating the Popover and CSS Anchor Positioning Polyfills, but there is still more we can do with your help.
Display color gamut ranges and more
OddContrast, OddBird’s color format converter and contrast checker, gets new features – including the ability to swap background and foreground colors, and display color gamut ranges on the color sliders. Contrast ratios now incorporate foreground color alpha values.
Start using author-defined functions
There’s been a lot of progress in the CSS Working Group lately, but I want to draw your attention to a prototype that landed in Chromium ‘Canary’ (v136+) browsers with the experimental platform features flag enabled. Author-defined Functions are coming to CSS, and you can start to experiment with them…