Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 基于类的视图-使用FormView将多个模型拉到一起_Django_Forms_Django Class Based Views - Fatal编程技术网

Django 基于类的视图-使用FormView将多个模型拉到一起

Django 基于类的视图-使用FormView将多个模型拉到一起,django,forms,django-class-based-views,Django,Forms,Django Class Based Views,我正在尝试构建一个调查应用程序。我定义了一个调查、问题和回答的模型,如下所示 我想做的是创建一个调查(在admin中,我可以这样做),然后将此调查显示为用户可以填写的页面 我第一次使用基于类的视图,我一直在研究如何呈现调查表以及相关的问题,并允许输入答案 在管理中,我创建了一个调查,并成功地向其中添加了问题。FormView(和UpdateView,作为另一个SO答案的一部分尝试)允许我显示调查模型的“名称”和“描述”属性,但问题不会出现 我需要做什么才能在我的表格中提供调查及其问题(并允许用户

我正在尝试构建一个调查应用程序。我定义了一个调查、问题和回答的模型,如下所示

我想做的是创建一个调查(在admin中,我可以这样做),然后将此调查显示为用户可以填写的页面

我第一次使用基于类的视图,我一直在研究如何呈现调查表以及相关的问题,并允许输入答案

在管理中,我创建了一个调查,并成功地向其中添加了问题。FormView(和UpdateView,作为另一个SO答案的一部分尝试)允许我显示调查模型的“名称”和“描述”属性,但问题不会出现

我需要做什么才能在我的表格中提供调查及其问题(并允许用户输入回复)

模型

class Survey(models.Model):
    name = models.CharField(max_length=400)
    description = models.TextField()

    def survey_questions(self):
        if self.pk:
            return Question.objects.filter(survey=self.pk)
        else:
            return None

    def publish(self):
        self.published_date = timezone.now()
        self.save()

class Question(models.Model):
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
    question = models.TextField()

class Response(models.Model):
    member = models.ForeignKey(user_model, on_delete=models.SET_NULL, null=True, blank=True)
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now_add=True)

class AnswerBase(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    response = models.ForeignKey(Response, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

class AnswerText(AnswerBase):
    body = models.TextField(blank=True, null=True)
网址

形式


好的,这样做的方法是使用。它们的设置有点草率,但不应该花你太长时间。我建议使用

我还重写了您的一些代码,希望能让您的生活更轻松:

models.py

class SurveyTemplate(models.Model):
    name = models.CharField(max_length=400)
    description = models.TextField()
    # You were missing this I believe
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()


class Question(models.Model):
    # Now you can do SurveyTemplate.questions.all()
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE, related_name='questions')
    question = models.TextField()


class SurveyResponse(models.Model):
    member = models.ForeignKey(user_model, on_delete=models.SET_NULL, null=True, blank=True)
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now_add=True)


class Answer(models.Model):
    # Now you can do Question.answers.all()
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
    # Now you can do Response.answers.all()
    response = models.ForeignKey(Response, on_delete=models.CASCADE, related_name='answers')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
views.py

from django.views.generic import CreateView


# CreateView is Django's built in View for creating an object, you would be best to use it
class SurveyResponseView(CreateView):
    model = Survey
    template = 'survey/survey_detail.html'
    form_class = ResponseForm
forms.py

class ResponseForm(forms.ModelForm):
    class Meta():
        model = Survey
        fields = '__all__'

我目前正在查看表单集,因此可能我还没有看到全部情况,但是您确定“CreateView”(用于
SurveyResponseView
)是正确的通用视图吗?当我点击填写
响应表单
(127.0.01/survey/0)时,我可以看到属于
调查
模型的字段(
名称
说明
发布日期
)。我希望用户填写
答案
字段,而不是
调查
字段。我假设稍后我将禁用对
调查
字段的编辑,并通过表单集显示
问题
答案
,对吗?只是想确定一下-CBV有点让人困惑是的,因此您需要使用表单集将各种应答对象添加到视图中。你有没有实施过这样的计划:他的指南很好。
class SurveyTemplate(models.Model):
    name = models.CharField(max_length=400)
    description = models.TextField()
    # You were missing this I believe
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()


class Question(models.Model):
    # Now you can do SurveyTemplate.questions.all()
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE, related_name='questions')
    question = models.TextField()


class SurveyResponse(models.Model):
    member = models.ForeignKey(user_model, on_delete=models.SET_NULL, null=True, blank=True)
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now_add=True)


class Answer(models.Model):
    # Now you can do Question.answers.all()
    question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
    # Now you can do Response.answers.all()
    response = models.ForeignKey(Response, on_delete=models.CASCADE, related_name='answers')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
from django.views.generic import CreateView


# CreateView is Django's built in View for creating an object, you would be best to use it
class SurveyResponseView(CreateView):
    model = Survey
    template = 'survey/survey_detail.html'
    form_class = ResponseForm
class ResponseForm(forms.ModelForm):
    class Meta():
        model = Survey
        fields = '__all__'