Pregunta

Tengo una aplicación de cuestionario que permite la creación dinámica de una forma. En mi sistema actual lo vinculo a un proyecto. Aquí hay un ejemplo de mis modelos. Quiero separar la aplicación del cuestionario completamente de las dependencias de las otras aplicaciones en mi proyecto Django actual.

#project.models
class Project(models.Model):
    name = models.CharField(max_length.....
    category = models.CharField(max_length
    question_sets = models.ManyToManyField(Question_Set)

#questionnaire.models
class Question(models.Model):
    question = models.CharField(max_length....
    question_type = models.IntegerField(choices=.....

class Question_set(models.Model):
    name = models.CharField(....
    questions = models.ManyToManyField(Question)

Dentro de mi cuestionario. En la función de creación de preguntas_set, tengo un formulario que me permite agregar preguntas creadas al pregunta_set y luego guardar el pregunta_set. Actualmente también paso el proyecto_id en la URL a esta vista para que pueda obtener la instancia del proyecto y agregar el conjunto de preguntas

#questionnaire.views
def question_set_create(request, project_id, form_class=AddSetForm, template_name=....):
    if request.method = "POST":
        form = form_class(request.POST)
        if form.is_valid():
            set = form.save()
            project = Project.objects.get(id=project_id)
            project.question_sets.add(set)
            ....

#questionnaire.urls
#pattern for question_set_create
url(r'^(?P<project_id>[-\w]+)/add_set/$', 'questionnaire_create' , name="project_questionnaire_create"),

Creo que la solución involucra al django Tipo de contenido Marco, pero no estoy seguro de la mejor manera de pasar la clase modelo a través de la URL. Entonces, si el conjunto de preguntas se guardara en el modelo FOO en lugar del proyecto. ¿Cómo en la URL identificaría la clase modelo?

¿Fue útil?

Solución

Creo que el problema puede estar en la forma en que ha organizado sus modelos. También evitaría el uso de un nombre de modelo que termina en _set Como eso podría ser muy confuso. ¿Qué pasa con esto en su lugar?

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from questionnaire.models import Questionnaire

#project.models
class Project(models.Model):
    name = models.CharField(max_length.....
    category = models.CharField(max_length
    questionnaires = generic.GenericRelation(Questionnaire)

#questionnaire.models
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Question(models.Model):
    question = models.CharField(max_length....
    question_type = models.IntegerField(choices=.....

class Questionnaire(models.Model):
    name = models.CharField(...)
    questions = models.ManyToManyField(Question)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

Una vez que haya definido claramente el cuestionario como su propio modelo completo, crear una URL se vuelve más sencilla:

#questionnaire.urls
#pattern for question_set_create
url(r'^(?P<content_type>[-\w]+)/(?P<object_id>[-\w]+)/add_set/$', 'questionnaire_create' , name="questionnaire_create"),

Donde content_type es el nombre del tipo de contenido (digamos, 'Projects.project' o algo similar) y Object_ID es la clave principal del registro coincidente.

Por lo tanto, la URL equivalente para crear un cuestionario para el ID de proyecto #1 sería /questionnaires/projects.project/1/add_set/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top