2011-01-25 64 views
0

我有調查問卷應用程序,允許動態創建表單。在我目前的系統中,我將它鏈接到一個項目。這是我的模型的一個例子。我想在我當前的django項目中完全從其他應用程序的依賴關係中分離問卷應用程序。通過URL鏈接Django ContentType框架

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

在我的問卷調查視圖裏面,對於這個例子,我有兩個基本的函數Question_set create和Question create。在Question_set創建函數中,我有一個表單,允許我將創建的問題添加到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模型而不是Project。如何在URL中識別模型類?

回答

0

我認爲問題可能與您組織模型的方式有關。我也會避免使用以_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問卷對應的網址是/questionnaires/projects.project/1/add_set/

+0

感謝。我不熟悉generic.GenericRelation。每天學些新東西。我要檢查出 – 2011-01-25 14:48:30