0

我正在使用 Django 构建一个应用程序,它将有一个硬编码的测验,用户将定期填写 4 个选项。我无法实现这一点,以便用户可以在一页上填写表格,并保存与用户和当前日期相关的实例。有人可以帮忙解决这个问题吗?

模型.py

ANSWER_CHOICES = (
    (1, 'Never'),
    (2, 'Almost Never'),
    (3, 'Sometimes'),
    (4, 'Fairly Often'),
    (5, 'Very Often'),
)

class Answer(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='answer', null=True)
    answer = models.CharField(max_length=200, null=True)

    def __str__(self):
        return self.answer

class Quiz(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='quiz', null=True)
    question = models.CharField(max_length=200)
    answer = models.ForeignKey(Answer, on_delete=models.CASCADE, related_name='quiz_answer', null=True)
    pub_date = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.question

视图.py

def test(request):

    user = request.user

    questions = Quiz.objects.all()

    if request.method == 'POST':
        form = Form(request.POST)
        
        if form.is_valid():
            test = Quiz(
                answer=form.cleaned_data["answer"],
                user=user
            )
            test.save()
            return redirect('app:dashboard')
    else:
        form = Form()

    context = {
        'form':form,
    }
    
    return render(request, 'members/test.html', context)

表格.py

class Form(ModelForm):

    answer = forms.ModelChoiceField(widget=forms.RadioSelect, queryset=(Answer.objects.all()))

    class Meta:
        model = Quiz
        fields = ['answer']

测试.html

<form method="POST">
{% csrf_token %}
  <div class="card-body">
    {{ form|crispy }}
  </div>
  <!-- /.card-body -->
  <div class="card-footer">
   <button type="submit" class="btn btn-primary">Submit</button>
  </div>
</form>

理想情况下,我希望表单具有以下结构:

1.When did this happen?
a)recently
b)a while back
c) a long time ago
d)today

2.When was your last login?
a)recently
b)a while back
c) a long time ago
d)today
4

1 回答 1

0

您能否详细说明您的模型。我很困惑您正在尝试做什么 answer_choices 的作用是什么。如果您希望用户从该 answer_choice 变量中进行选择,那么

field_name = models.CharField(max_length = 50,choices = answer_choice)

这将在前端创建一个下拉菜单,您甚至可以设置默认值

观点变化

def test(request):
   user = request.user
   questions = Quiz.objects.all()
   if request.method == 'POST':
       form = Form(request.POST)
       if form.is_valid():
          fm = form.save(commit = False)
          fm.user = request.user
          fm.save()
        return redirect('app:dashboard')


  context = {
    'form':form,
  }
return render(request, 'members/test.html', context)
于 2021-02-23T11:11:11.177 回答