首页 > 解决方案 > 在 django 视图中创建嵌入式表单

问题描述

我有一个规则类,规则是问题和答案的组合:

class Rule(models.Model):
    name = models.CharField(max_length=32)

class Question(models.Model):
    name = models.CharField(max_length=32)
    rule_id = models.ForeignKey(Rule, on_delete=models.CASCADE, null=True, blank=True)

class Answer(models.Model):
    name = models.CharField(max_length=32)
    rule_id = models.ForeignKey(Rule, on_delete=models.CASCADE, null=True, blank=True)

我想为规则创建一个表单,其中有两个输入:一个用于问题,另一个用于答案。当我点击提交时,我应该在规则表中保存一条规则,在问题表中保存一个问题,在答案表中保存一个答案。这是我得到的最远的:我为每个模型创建了一个表单,我在一个视图方法中调用了这些表单:

def create_rule_view(request,id, sc_id):
    rule = RuleForm(request.POST or None)
    question= QuestionForm(request.POST or None)
    answer = AnswerForm(request.POST or None)
    if rule.is_valid() and question.is_valid() and answer.is_valid():
        rule.save()
        question.save()
        answer.save()
        return redirect('../')
    context = {
        'rule': rule,
        'question': question,
        'answer': answer
    }
    return render(request, "rule/create_rule.html", context)

但这不是我想要的视图,每个模型都是独立保存的。谁能为我找到解决方案?谢谢。

标签: djangodjango-formsdjango-templatesdjango-views

解决方案


我认为您可以像这样将这些字段添加到 RuleForm,并覆盖save保存它们的方法:

class RuleForm(forms.ModelForm):
    question = forms.CharField(required=True)
    answer = forms.CharField(required=True)

    class Meta:
       model = Rule
       fields=['name', 'question', 'answer']

    def save(self, commit=False):
       question = self.cleaned_data.pop('question')
       answer = self.cleaned_data.pop('answer') 
       rule = super(RuleForm, self).save(commit=True)
       Question.objects.create(rule=rule, name=question)
       Answer.objects.create(rule=rule, name=answer)
       return rule

现在,您只需在视图中传递规则表单:

def create_rule_view(request,id, sc_id):
    rule = RuleForm(request.POST or None)
    if rule.is_valid():
        rule.save()
        return redirect('../')
    context = {
        'rule': rule,
    }
    return render(request, "rule/create_rule.html", context)

推荐阅读