代码之家  ›  专栏  ›  技术社区  ›  Tessnim

在django视图中创建嵌入表单

  •  0
  • Tessnim  · 技术社区  · 6 年前

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

    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)
    

    但这不是我想要的视图,每个模型都是独立保存的。有人能帮我找到解决办法吗?谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   ruddra    6 年前

    我认为您可以像这样将这些字段添加到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)