gpt4 book ai didi

python - Django 模型表单 : show query form and handle post request for OneToMany fields

转载 作者:行者123 更新时间:2023-12-01 04:15:21 26 4
gpt4 key购买 nike

我是 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 草稿:

enter image description here

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

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 模型表单 : show query form and handle post request for OneToMany fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34369638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com