【问题标题】:Store a list of values in Django keys with a single submit使用单个提交在 Django 键中存储值列表
【发布时间】:2021-03-10 05:04:55
【问题描述】:

我可以在 views.py

中获取如下所有字段的值
if request.method == 'POST':
    teacher_get = request.POST.get('teacher')
    department_get = request.POST.get('department')
    subject_get = request.POST.get('subject')
    semester_get = request.POST.get('semester')
    answers = [v for q, v in request.POST.items() if q.startswith('question_')]

现在我想将这些值存储在 Student 类中,它的大部分字段都是外键。

class Student(models.Model):
    teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)   
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    department = models.ForeignKey(Department, on_delete=models.CASCADE)
    semester = models.ForeignKey(Semester, on_delete=models.CASCADE)
    answer = models.SmallIntegerField(choices=RATING_CHOICES, default=1)

例如,学生登录表单页面并开始回答问题,最后当他/她点击提交按钮时,所有问题都有答案。换句话说,在提交之后,我有例如 15 个学生对象,每个对象属于一个特定的问题。 我的表单如下所示:

    <form action="{% url 'question'%}" method="POST">
      {% csrf_token %}
      <select name="teacher">
        {% for teacher in teacher %}
          <option value="{{ teacher.name }}">{{ teacher.name }}</option>
        {% endfor %}
      </select>
    </div>

<div>
  <select name="department">
    {% for department in department %}
      <option value="{{ department.name }}">{{ department.name }}</option>
    {% endfor %}
  </select>
</div>

<div>
  <select name="semester">
    {% for semester in semester_choices %}
      <option value="{{ semester.0 }}">{{ semester.1 }}</option>
    {% endfor %}
  </select>
</div>

<div>
  <select name="subject">
    {% for subject in subject %}
      <option value="{{ subject.name }}">{{ subject.name }}</option>
    {% endfor %}
  </select>
</div>

  {% for question in question %}
      <ol>{{ question.question }}</ol>
      
      {% for choice in rating_choices %}
       <input type="radio" name="question_{{question.id}}" value="{{choice.0}}">{{choice.1}}
      {% endfor %}

      {% endfor %} <br>

  <input type="submit" value="Vote">
</form>

我尝试在对象 (Teacher.objects.create(name=teacher_get)) 中分配存储值,结果在 Teacher 类中创建了一个新对象。

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    您可以创建 Django 模型表单,然后使用它来存储数据:

    # form
    from django.forms import ModelForm    
    from .models import Student
    
    
    class StudentForm(ModelForm):
         class Meta:
             model = Student
             fields = '__all__'
    
    # view
    if request.method == 'POST':
        form = StudentForm(request.POST)
        if form.is_valid():
            form.save()
    

    但是您需要在表单的html模板中进行一些更改,以将value的属性更改为相应模型的主键:

    <select name="teacher">
        {% for teacher in teacher %}
          <option value="{{ teacher.pk }}">{{ teacher.name }}</option>
        {% endfor %}
      </select>
    </div>
    
    <div>
      <select name="department">
        {% for department in department %}
          <option value="{{ department.pk }}">{{ department.name }}</option>
        {% endfor %}
      </select>
    </div>
    
    <div>
      <select name="semester">
        {% for semester in semester_choices %}
          <option value="{{ semester.pk }}">{{ semester.1 }}</option>
        {% endfor %}
      </select>
    </div>
    
    <div>
      <select name="subject">
        {% for subject in subject %}
          <option value="{{ subject.pk }}">{{ subject.name }}</option>
        {% endfor %}
      </select>
    </div>
    

    更多信息请查看ModelForm documentation

    【讨论】:

      猜你喜欢
      • 2018-10-28
      • 2020-12-30
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 2013-09-20
      相关资源
      最近更新 更多