2009-09-22 7 views
2

Ok, je travaille sur une application Django avec plusieurs modèles différents, à savoir Comptes, Contacts, etc., chacun avec un ensemble de champs différent. Je dois pouvoir permettre à chacun de mes utilisateurs de définir leurs propres champs en plus des champs existants. J'ai vu plusieurs manières différentes d'implémenter ceci, d'avoir un grand nombre de CustomFields et de simplement mapper un nom personnalisé à chaque champ utilisé par chaque utilisateur. J'ai aussi des recommandations pour implémenter une cartographie complexe ou un stockage/extraction de style XML/JSON de champs définis par l'utilisateur. Donc, ma question est la suivante, est-ce que quelqu'un a implémenté des champs définis par l'utilisateur dans une application Django? Si oui, comment l'avez-vous fait et quelle a été votre expérience avec la mise en œuvre globale (stabilité, performance, etc.)?Comment créer des champs définis par l'utilisateur dans Django

Mise à jour: Mon but est de permettre à chacun de mes utilisateurs de créer un numéro de chaque type d'enregistrement (comptes, contacts, etc.) et d'associer des données définies par l'utilisateur à chaque enregistrement. Ainsi, par exemple, un de mes utilisateurs pourrait vouloir associer un SSN à chacun de ses contacts, je devrais donc stocker ce champ supplémentaire pour chaque enregistrement Contact qu'il crée.

Merci!

Marque

+0

Vous voudrez peut-être clarifier vos objectifs. Voulez-vous simplement associer des métadonnées arbitraires à ces utilisateurs ou devez-vous rechercher des utilisateurs par champs spécifiques? –

+0

Vous pourriez me chercher cette référence: http://stackoverflow.com/a/7934577/497056 –

Répondre

3

Et si vous deviez utiliser une clé ForeignKey?

Ce code (non testé et pour la démo) suppose qu'il existe un ensemble de champs personnalisés à l'échelle du système. Pour le rendre spécifique à l'utilisateur, vous ajouteriez un "user = models.ForiegnKey (User)" sur la classe CustomField.

class Account(models.Model): 
    name = models.CharField(max_length=75) 

    # ... 

    def get_custom_fields(self): 
     return CustomField.objects.filter(content_type=ContentType.objects.get_for_model(Account)) 
    custom_fields = property(get_fields) 

class CustomField(models.Model): 
    """ 
    A field abstract -- it describe what the field is. There are one of these 
    for each custom field the user configures. 
    """ 
    name = models.CharField(max_length=75) 
    content_type = models.ForeignKey(ContentType) 

class CustomFieldValueManager(models.Manager): 

    get_value_for_model_instance(self, model): 
     content_type = ContentType.objects.get_for_model(model) 
     return self.filter(model__content_type=content_type, model__object_id=model.pk) 


class CustomFieldValue(models.Model): 
    """ 
    A field instance -- contains the actual data. There are many of these, for 
    each value that corresponds to a CustomField for a given model. 
    """ 
    field = models.ForeignKey(CustomField, related_name='instance') 
    value = models.CharField(max_length=255) 
    model = models.GenericForeignKey() 

    objects = CustomFieldValueManager() 

# If you wanted to enumerate the custom fields and their values, it would look 
# look like so: 

account = Account.objects.get(pk=1) 
for field in account.custom_fields: 
    print field.name, field.instance.objects.get_value_for_model_instance(account) 
Questions connexes