Вы можете хранить дополнительные данные в сериализованном состоянии. Это может сэкономить вам некоторые попадания в БД и немного упростить структуру вашей базы данных. Может быть лучшим вариантом, если вы планируете использовать данные только для целей отображения.
Пример реализации (не тестировался) ::
import yaml
from django.db import models
class UserProfile(models.Model):
user = models.OneToOneField('auth.User', related_name='profile')
_additional_info = models.TextField(default="", blank=True)
@property
def additional_info(self):
return yaml.load(self._additional_info)
@additional_info.setter
def additional_info(self, user_info_dict):
self._additional_info = yaml.dump(user_info_dict)
Когда вы присваиваете profile.additional_info
, скажем, словарь, он вместо этого сериализуется и сохраняется в _additional_info
(не забудьте сохранить экземпляр позже). И затем, когда вы получаете доступ к additional_info
, вы получаете этот словарь Python.
Полагаю, вы также можете написать специальное поле, чтобы справиться с этим.
ОБНОВЛЕНИЕ (на основе вашего комментария):
Таким образом, похоже, что настоящая проблема здесь в том, как автоматически создавать и проверять формы для профилей пользователей. (Это остается независимо от того, используете ли вы сериализованные опции или сложную структуру данных.)
И так как вы можете создавать динамические формы без особых проблем [1], тогда главный вопрос - как их проверять.
Думая об этом ... Администратор должен будет указать валидаторы (или тип поля) для каждого настраиваемого поля в любом случае, верно? Так что вам понадобится какая-то опция конфигурации, скажем,
CUSTOM_PROFILE_FIELDS = (
{
'name': 'user_ip',
'validators': ['django.core.validators.validate_ipv4_address'],
},
)
И затем, когда вы инициализируете форму, вы определяете поля с их валидаторами в соответствии с этим параметром.
[1] См. Также этот пост Джейкоба Каплана-Мосса о динамическом формировании формы. Однако это не касается проверки.