2011-04-22 1 views
1

Résumé:recherche bonne approche pour conserver des données soumises par le biais dynamique Django Forms

Vous cherchez un bon moyen d'enregistrer des données sur les modèles Django pour lesquels les formes associées sont générées dynamiquement.

Détail:

J'ai Puzzling sur la meilleure approche pour créer des formes de Django dynamiques soutenus par des modèles. Par exemple, je voudrais créer une interface dans laquelle un utilisateur peut créer un formulaire HTML, personnaliser dynamiquement les types de champs de ce formulaire (nombre, chaîne, liste déroulante, date, etc.), puis afficher ce formulaire dans d'autres utilisateurs afin que ces utilisateurs puissent soumettre des données enregistrées dans une base de données. Je ne suis pas sûr de savoir comment faire une approche efficace pour conserver les données.

www.formsite.com et www.mailchimp.com ont des outils de création de formulaire qui sont de bons exemples de ce que j'essaie de faire. Jacob Kaplan-Moss a un excellent tutorial sur la façon de créer les formes dynamiquement, mais le tutoriel ne parvient pas à la façon de conserver les données. Comme exemple factice, une approche (peut-être mauvaise?) Pourrait être de créer des modèles comme ci-dessous, où il y a une table de base de données pour SurveyQuestions (stocker les noms personnalisables et les types de données de chaque champ) et une pour les réponses SurveyQuestionResponses (chaque enregistrement stockant une réponse individuelle pour une question SurveyQuestion sur un sondage particulier).

Cependant, il semble que cette approche puisse aboutir à des requêtes vraiment complexes et lentes. Par exemple, si un sondage comporte 10 questions et que vous souhaitez afficher 10 réponses d'utilisateur à ce sondage, il y aura des requêtes pour sélectionner les 10 questionnaires d'enquête, puis pour chaque répondant, une requête sélectionnera chacune des réponses à l'enquête SurveyQuestionResponses. Il semble que le nombre de requêtes nécessaires puisse s'accumuler très vite!

class Survey(models.Model): 
    # some fields here. 
    pass 

class SurveyQuestion(models.Model): 
    """ Defines the headings and field 
     types for a given Survey. 
    """ 
    survey = models.ForeignKey(Survey) 
    field_name = models.CharField(
     max_length=255, 
     help_text='Enter the name for this field heading') 
    field_type = models.IntegerField(
     choices=choices.FIELD_TYPES, 
     help_text='Enter the data type for this field') 
    display_order = models.IntegerField(default=0) 

class SurveyQuestionResponse(models.Model): 
    survey_field = models.ForeignKey(SurveyQuestion) 
    response value = models.TextArea(blank=True, null=True) 

Y a-t-il une meilleure approche pour conserver les données basées sur des formulaires dynamiques? Dois-je convertir la réponse d'un répondant à une sorte de format décapé et la stocker dans un TextField (Au lieu d'avoir 10 enregistrements SurveyQuestionResponse, il y aurait un enregistrement avec toutes les valeurs de réponse décapées)? Je ne connais pas très bien les options NoSQL, mais une approche NoSQL fonctionnerait-elle mieux pour ce genre de choses? Y a-t-il une sorte de rendu ou de mise en cache qui aurait du sens?

Je continue à rencontrer des situations où l'enregistrement de données à partir de formulaires dynamiques comme ceci serait très utile. Je me demande quelles sont les approches des autres. Tout conseil est fort apprécié. Merci d'avoir lu cette longue question.

Joe

Répondre

1

Pour une base de données relationnelle d'un modèle d'entité valeur-attribut (EAV) pourrait être utilisé pour obtenir un schéma dynamique, ou ouvert. Les bases de données relationnelles ne sont pas vraiment adaptées à ce type de schéma, ce qui entraîne généralement des requêtes très lentes avec le temps. NoSQL a son propre ensemble de problèmes mais je pense qu'il serait le mieux adapté à vos besoins. Si vous décidez de prendre cette route, vous pouvez jeter un oeil à MongoDB. Je ne l'ai pas beaucoup utilisé, mais il semble plus proche de la base de données relationnelle que l'autre base de données NoSQL, et son interface python semble assez similaire à l'ORM de django. Je me souviens avoir trouvé un bel exemple d'EAV pour Django. Bien que je ne me rappelle pas où en ce moment.

+0

Merci Solartic, il est bon d'avoir un nom associé à ce que j'essaie de faire - le modèle EAV. Il semble qu'il y ait beaucoup d'informations sur ce modèle en ligne. Je vais aussi jouer avec MongoDB, pour voir comment je peux l'intégrer. Merci pour vos conseils. –

Questions connexes