質問

フォームの動的な作成を可能にするアンケートアプリがあります。私の現在のシステムでは、プロジェクトにリンクします。これが私のモデルの例です。現在のDjangoプロジェクトの他のアプリの依存関係からアンケートアプリを完全に分離したいと思います。

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

私のアンケート内では、この例では、2つの基本的な関数question_set createとquestion createを使用します。 question_set Create関数には、作成された質問をquestion_setに追加して、question_setを保存できるフォームがあります。現在、私はこのビューにURLのproject_idを渡すので、プロジェクトインスタンスを取得してquestion_setを追加できます

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

解決策にはDjangoが関係していると思います contentType フレームワークですが、URLを介してモデルクラスを通過する最良の方法がわかりません。したがって、question_setがプロジェクトの代わりにfooモデルに保存された場合。 URLでモデルクラスをどのように識別しますか?

役に立ちましたか?

解決

問題は、モデルを整理した方法にあると思います。また、で終わるモデル名の使用も避けます _set それは非常に混乱する可能性があります。代わりにこれはどうですか:

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

アンケートを独自の完全なモデルとして明確に定義したら、URLの作成がより簡単になります。

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

Content_Typeはコンテンツタイプの名前(「Projects.Project」など)の名前であり、Object_IDはマッチングレコードの主要なキーです。

したがって、プロジェクトID#1のアンケートを作成するための同等のURLは /questionnaires/projects.project/1/add_set/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top