Как добавить несколько записей в несколько моделей, которые имеют отношение один к одному в django? - PullRequest
0 голосов
/ 24 апреля 2020

Итак, у меня есть эти две модели

class Question(models.Model):
    question_image = models.ImageField(upload_to="Questions/images", default="")
    subject = models.CharField(max_length=100)
    topic = models.CharField(max_length=100)
    type = models.CharField(max_length=100)
    exam_type = models.CharField(max_length=100)
    date_asked = models.DateField(default="")


class Option(models.Model):
    question_id = models.ForeignKey(Question, on_delete=models.CASCADE)
    text = models.CharField(max_length=100)
    text.null = True
    text.blank = True
    option_image = models.ImageField(upload_to="Options/images", default="")
    option_image.null =True
    option_image.blank =True
    is_correct = models.BooleanField()

Вы видите, что вопрос имеет одну-две взаимосвязи с опциями. Теперь я хочу добавить вопрос и соответствующий этому вопросу несколько опций в таблице опций. Поэтому, если вопрос с идентификатором = 1 будет иметь несколько вариантов в таблице параметров с параметром question_id = 1.

Итак, я сделал эти две формы

from django import forms
from practice.models import Question
from practice.models import Option
from django.forms import ModelForm

class QuestionForm(ModelForm):
    class Meta:
        model = Question
        fields = ['question_image', 'subject', 'topic', 'type' , 'exam_type' , 'date_asked']


class OptionForm(ModelForm):
    class Meta:
        model = Option
        fields = ['text' , 'option_image' , 'is_correct']

Теперь в шаблоне HTML в Я хочу добавить столько опций, сколько захочу, поэтому я написал этот HTML код. Код javascript, необходимый для добавления дополнительных опций, еще не готов, но вы поймете, что у меня будет несколько опционных форм и одна форма вопроса. Посмотрите на HTML ниже, а пока просто давайте две опции формы.

{% extends "users/base.html" %}
{% load crispy_forms_tags %}
{% block content %}

<div class="container">


  <div class="content-section">
    <form method="POST" enctype="multipart/form-data">
      {% csrf_token %}
      <fieldset class="form-group">
        <legend class="border-bottom mb-4">Add Question</legend>
        {{ q_form|crispy }}
        <h4 class="border-bottom mb-4 pdb-2" style="padding-bottom : 1rem;">Options
          <button type="button" class="add-btn btn btn-success">+ Add Options</button>
        </h4>
        <div class="container text-left" id="option-list">


          <div class="row">
            <div class="col-lg-4 col-xl-4 col-md-4 col-sm-12">
              {{ o_form.text| as_crispy_field  }}
            </div>
            <div class="col-lg-4 col-xl-4 col-md-4 col-sm-12">
              {{ o_form.option_image| as_crispy_field  }}
            </div>
            <div class="col-lg-4 col-xl-4 col-md-4 col-sm-12">
              {{ o_form.is_correct| as_crispy_field  }}
            </div>
          </div>

          <div class="row">
            <div class="col-lg-4 col-xl-4 col-md-4 col-sm-12">
              {{ o_form.text| as_crispy_field  }}
            </div>
            <div class="col-lg-4 col-xl-4 col-md-4 col-sm-12">
              {{ o_form.option_image| as_crispy_field  }}
            </div>
            <div class="col-lg-4 col-xl-4 col-md-4 col-sm-12">
              {{ o_form.is_correct| as_crispy_field  }}
            </div>
          </div>


        </div>

      </fieldset>
      <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Add Question</button>
      </div>
    </form>
  </div>

</div>
{% endblock content %}

Это мои views.py

from django.shortcuts import render,redirect
from django.http.response import HttpResponse
from .forms import QuestionForm , OptionForm


def add(request):
    q_form = QuestionForm()
    o_form = OptionForm()

    if request.method == 'POST':
        u_form = QuestionForm(request.POST, request.FILE)
        o_form = OptionForm(request.POST,
                            request.FILE,
                            instance=request.question)
        if u_form.is_valid() and o_form.is_valid():
            u_form.save()
            p_form.save()
            print("everthing saved")
            return redirect('index')
        else:
            print("not saved")
            return redirect('index')
    else:
        q_form = QuestionForm()
        o_form = OptionForm()


    context = {
    'q_form' : q_form,
    'o_form' : o_form
    }

    return render(request,'add_question/add.html' , context)

ТАК у меня вопрос, как мне добавить несколько опций к одному и тому же идентификатору вопроса. И как мне передать идентификатор вопроса или экземпляр вопроса в форму параметров, чтобы он знал, какой вопрос я имею в виду, чтобы добавить параметр. Я хочу добавить несколько вариантов для одного вопроса, как я могу это сделать.

Спасибо за помощь заранее!

...