Package: django-domande
![domande](https://raw.github.com/bulkan/django-domande/master/logo.png)Logo by [@aurorachiarello](http://github.com/aurorachiarello)[![Build Status](https://travis-ci.org/bulkan/django-domande.png?branch=master)](https://travis-ci.org/bulkan/django-domande)A plugable Django app to represent a generic questions on forms.Dependencies============Here are the list of dependencies;* [django-crispy-forms](http://django-crispy-forms.readthedocs.org) - This is used to render form fields with Bootstrap classes* [django_polymorphic](https://github.com/chrisglass/django_polymorphic/) - Provides an easy way of doing model inheritence.* [South](http://south.readthedocs.org/en/latest/) - For model migration. Please use it :smile:Installation===========For stable PyPI versionpip install django-domandeTo get development versionpip install git+git://github.com/bulkan/django-domande.gitIn your ```settings.py``` file change ```INSTALLED_APPS``` and add;```pythonINSTALLED_APPS = [...'crispy-forms'   # need to add this for it's template tags to load'polymorphic',   # provides admin templates'domande'...]```__Note__ I'm assuming you have South already installed if not add ```south``` to ```INSTALLED_APPS```General-------```domande``` uses model inheritence to simplify relationships to a list of questions and it does this withthe help of ```django-polymorphic```. At the moment ```domande``` supports two types of questions that arerendered differently by their accompanying forms.A TextQuestion were the __answer__ is a text and a ChoiceQuestion were the __answer__ is chosenby a set of Choices. TextQuestion and ChoiceQuestion are subclasses of Question.Example Usage=============Models-----Create a model with a ManyToManyField to domande.models.Question. For example a Questionnaire;```pythonfrom django.db import modelsfrom django.contrib.contenttypes import genericfrom domande.models import Question, Answerclass Questionnaire(models.Model):name = models.CharField(max_length=256)questions = models.ManyToManyField(Question)```Once you add a ManyToManyField to ```domande.models.Question``` and register your model with the django admininterface the questions field will be handled uniquely. As ```domande.models.Questions``` is the parent modelwhen you create a new one the admin inteface will display an additional step of choosing the child model to create aninstance of.View----Now you need to render the list of Questions in a view;```pythondef questionnaire_view(request):# for sake of example use .getquestionnaire = Questionnaire.objects.get(id=1)forms = [q.get_form()(prefix=str(q.id),content_object=request.user,question=q, form_tag=False)for q in questionnaire.questions.all().get_real_instances()]# form is a list of TextQuestionForm or ChoiceQuestionForm```domande's forms accept a ```content_object``` that is used when it creates and saves an Answer.domande doesn't know in advance what type of _user_ or _entry_ model you have so it usesdjango's builtin ```ContentType``` framework to solve this.In the above example it uses ```request.user```.Template--------in the template render the forms like so;```html{% load crispy_forms_tags %}<form method="post">{% for form in forms %}{% crispy form %}{% endfor %}</form>```to process the validity of the forms and save the Answers;```pythondef save_view(request, questionnaire):# for sake of example use .getquestionnaire = Questionnaire.objects.get(id=questionnaire)forms = [q.get_form()(request.POST or None,prefix=str(q.id),content_object=request.user,question=q, form_tag=False)for q in questionnaire.questions.all().get_real_instances()]forms_are_valid = []for form in forms:forms_are_valid.append(valid)valid = form.is_valid()if valid:t = form.save()forms_are_valid = all(forms_are_valid)```Each question model in domande has an Answer model that relates to it. A ChoiceQuestion will use aChoiceAnswer and a TextQuestion will use a ChoiceAnswer.Development===========* Fork this repo, create a virtualenv and clone your fork. Then install the requirementspip install -r requirements.txt* If you have changed the models then create a migration;django-admin.py schemamigration --settings=domande.settings --pythonpath=$PWD* Please make sure existing tests pass and feel free to add more tests as you see fit.django-admin.py test --settings='tests.test_settings' --pythonpath=$PWD* Submit Pull Request