Frage

Ich habe Fragebogen -App, die die dynamische Erstellung einer Form ermöglicht. In meinem aktuellen System verlinke ich es mit einem Projekt. Hier ist ein Beispiel für meine Modelle. Ich möchte die Fragebogen -App vollständig von Abhängigkeiten der anderen Apps in meinem aktuellen Django -Projekt trennen.

#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)

In meinem Fragebogen. In der FRAGE_SET CREATE -Funktion habe ich ein Formular, mit dem ich erstellte Fragen zum Frage_Set hinzufügen und dann die Frage_set speichern kann. Derzeit bestehe ich auch das Projekt_ID in der URL an diese Ansicht, damit ich die Projektinstanz erhalten und die Frage_set hinzufügen kann

#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"),

Ich glaube, die Lösung betrifft den Django Inhaltstyp Framework, aber ich bin mir nicht sicher, wie man die Modellklasse über die URL am besten übergeben kann. Wenn also die Frage_Set auf Foo -Modell anstelle von Projekten gespeichert werden sollte. Wie würde ich in der URL die Modellklasse identifizieren?

War es hilfreich?

Lösung

Ich denke, das Problem kann in der Art und Weise sein, wie Sie Ihre Modelle organisiert haben. Ich würde auch die Verwendung eines Modellnamens vermeiden, der in endet _set da das sehr verwirrend werden könnte. Was ist stattdessen mit diesem:

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()

Sobald Sie den Fragebogen klar als sein eigenes vollständiges Modell definiert haben, wird das Erstellen einer URL einfacher:

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

Wobei content_type der Name des Inhaltstyps ist (z. B. 'Projects.Project' oder ähnliches) und Object_id der Primärschlüssel des Matching -Datensatzes.

Die äquivalente URL zum Erstellen eines Fragebogens für die Projekt -ID #1 wäre also /questionnaires/projects.project/1/add_set/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top