Связывание инфраструктуры Django ContentType через URL - PullRequest
0 голосов
/ 25 января 2011

У меня есть приложение для анкетирования, которое позволяет динамически создавать форму.В моей текущей системе я связываю это с Проектом.Вот пример моих моделей.Я хочу полностью отделить приложение для анкетирования от зависимостей других приложений в моем текущем проекте 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)

Внутри моего questionnaire.views, для этого примера, у меня есть две базовые функции Question_set create и Question create.В функции создания Question_set у меня есть форма, которая позволяет мне добавлять созданные вопросы в Question_set и затем сохранять Question_set.В настоящее время я также передаю project_id в URL-адресе этому представлению, чтобы получить экземпляр Project и добавить 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 Framework, но яНе уверен, что лучший способ передать класс модели через URL.Так что, если Question_set должен был быть сохранен в модель Foo вместо Project.Как в URL я могу определить класс модели?

1 Ответ

0 голосов
/ 25 января 2011

Я думаю, проблема в том, как вы организовали свои модели.Я бы также избегал использования названия модели, заканчивающегося на _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 являются первичным ключом соответствующей записи.

Таким образом, эквивалентный URL для создания вопросника для идентификатора проекта # 1 будет /questionnaires/projects.project/1/add_set/

...