создавать встроенные формы в представлении Django - PullRequest
0 голосов
/ 15 января 2019

У меня есть класс правил, правило - это комбинация вопроса и ответа:

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 Ответ

0 голосов
/ 15 января 2019

Я думаю, что вы можете добавить эти поля в 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)
...