2011-01-25 2 views
0

양식의 동적 작성을 허용하는 설문지 앱이 있습니다. 현재 시스템에서는 프로젝트에 연결합니다. 다음은 내 모델의 예입니다. 설문 조사 앱을 현재의 장고 프로젝트에서 다른 앱의 의존성과 완전히 분리하고 싶습니다.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 create 함수에는 Question_set에 생성 된 Questions를 추가 한 다음 Question_set를 저장할 수있는 양식이 있습니다. 현재 나는 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"), 

을 프로젝트 인스턴스를 얻을 추가 할 수 있도록 나는 또한이 솔루션은 장고 ContentType 프레임 워크를 포함 생각이보기에 URL에 PROJECT_ID을 통과하지만 난에 대해 갈 수있는 가장 좋은 방법은 확실하지 않다 모델 클래스를 url을 통해 전달합니다. 그래서 Question_set이 Project 대신에 Foo 모델에 저장 되었다면. 어떻게 URL에서 모델 클래스를 식별 할 수 있습니까?

답변

0

문제는 귀하의 모델을 구성한 방식에 달려 있다고 생각합니다. 나는 또한 매우 혼란 스러울 수있는 _set으로 끝나는 모델 이름의 사용을 피할 것이다. 대신 이것에 대해 무엇 :

당신이 명확하게 자신의 완전한 모델로 설문지를 정의 URL을 만드는 것은 더 간단하게하면
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() 

:

#questionnaire.urls 
#pattern for question_set_create 
url(r'^(?P<content_type>[-\w]+)/(?P<object_id>[-\w]+)/add_set/$', 'questionnaire_create' , name="questionnaire_create"), 
콘텐츠 _이 콘텐츠 형식의 이름입니다

(예를 들어 , 'projects.project'또는 비슷한 것)이고 object_id는 일치하는 레코드의 기본 키입니다.

그래서 프로젝트 ID # 1에 대한 설문지를 작성하기위한 해당 URL은 /questionnaires/projects.project/1/add_set/

+0

감사 할 것이다. 나는 generic.GenericRelation에 익숙하지 않다. 매일 새로운 것을 배우십시오. 그것을 체크 아웃하려고합니다 –

+0

"projects.project"귀하의 URL 정규식과 일치하지 않습니다. 정규 표현식에 대한 전문가는 아니지만 'url (r'^ (? P [- \ w] +. [- \ w] +)/(? P [- \ w] +)/add_set/$ ''가 작동 할 수도 있습니다. – LaundroMat

+0

... ContentType 객체의 .name에 공백이나 특수 문자를 처리하는 방법은 무엇입니까? – jMyles