我是Django的新手,在google / SO上搜索后找不到类似的问题。

我有一个名为Questions的模型,它具有多个(2-4)选择,并定义如下:

class Question(models.Model):
  name = models.CharField(max_length=128)
class Choice(models.Model):
  name = models.CharField(max_length=256)
  is_correct = models.BooleanField(default=False)
  question = models.ForeignKey(Question, on_delete=models.CASCADE)


在多个选择中,只有一个是正确的。

我想做的事情:在一个页面中,用户可以提交一个问题以及多项选择,这是UI的草稿:

python - Django模型表单:显示查询表单并处理OneToMany字段的发布请求-LMLPHP

我的第一个问题:我已经定义了ModelForm,但是不知道如何在QuestionForm中添加“ choices”字段:

class QuestionForm(ModelForm):
  name = forms.CharField(max_length=128)
  description = forms.CharField(max_length=256)
  class Meta:
    model = Question
    fields = ['name', 'description']

class ChoiceForm(ModelForm):
  name = forms.CharField(max_length=256)
  is_correct = forms.BooleanField()
  class Meta:
    model = Choice
    fields = ['name', 'is_correct']


除了手动编写之外,是否可以使用ModelForm渲染上述HTML页面?

我的第二个问题:如果使用单击“提交”按钮,则使用AJAX将JSON数据发送到后端服务器,这是表单数据的示例:

name:question1
choices[][name]:choice1
choices[][is_correct]:1
choices[][name]:choice2
choices[][is_correct]:0


这是我处理请求的代码:

form = QuestionForm(request.POST)
if form.is_valid():
  question = form.save()


如何解析请求中的选择?
如何解析POST请求中的多个选项数据?

再次,我是Django的新手,所有的答案/建议都受到高度赞赏。

最佳答案

要为具有OneToMany关系的模型创建表单,我建议您使用Django的内联表单集:https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#inline-formsets

这是为相关模型创建表单的一种非常简单而优雅的方法。

为了解析选择,用户输入了您可以覆盖表单的clean方法。在这种情况下,通常检查用户内容并准备将其存储到数据库中。 https://docs.djangoproject.com/en/1.8/ref/forms/validation/#form-field-default-cleaning

因此清洁可能如下所示:

class QuestionForm(ModelForm):
    ...
    def clean(self):
        cleaned_data = super(QuestionForm, self).clean()
        if cleaned_data['choice_name'].startswith('Something'):
            raise forms.ValidationError(
                "Choice names cannot start with 'Something'!"
            )

关于python - Django模型表单:显示查询表单并处理OneToMany字段的发布请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34369638/

10-12 18:43
查看更多