Django Form Logic:拆分并显示预填充值

时间:2017-12-04 22:03:53

标签: django django-forms

假设我有一个拥有几个不同字段的模型。

models.py

class Items(models.Model):
    languages = models.Charfield(...)
    title = models.Charfield(...)
    audio = models.Charfield(...)

使用分隔符(“||”)将数据保存在每个数据中。我想创建一个分割数据的表单,然后使用保存的数据预填充值。

理论上:

{'languages': 'English||French||German'}
{'title': '1.1||Red Balloon||Banana'}
{'audio': 'yes||no||yes'}

将分为:

{'languages': ['English', 'French', 'German']}
{'title': ['1.1', 'Red Balloon', 'Banana']}
{'audio': ['yes', 'no', 'yes']}

然后每个值都会自动填充值字段。最终显示为:

<tr>
  <td><input type="text" name="languages[]" value="English"></td>
  <td><input type="text" name="title[]" value="1.1"></td>
  <td><input type="text" name="audio[]" value="yes"></td>
</tr>
<tr>
  <td><input type="text" name="languages[]" value="French"></td>
  <td><input type="text" name="title[]" value="Red Balloon"></td>
  <td><input type="text" name="audio[]" value="no"></td>
</tr>
...

例如,由于每行都有不同数量的“语言”,因此创建此类表单的首选方法是什么。我正在使用Django 1.11。发布了第一个问题,如果我在这篇文章中遗漏了一些内容,你能不能告诉我?我也搜索过与此相关的信息,但我还没有找到解决方案。谢谢!

- 编辑反映charFields持有用户输入。在此示例中,输入“语言”和“标题”不够一致,无法将它们用作多选字段。

2 个答案:

答案 0 :(得分:1)

看看Django Formsets

在您的情况下,您需要先定义某种ItemForm

from django import forms
class ItemForm(forms.Form):
    language = forms.CharField()
    setting = forms.CharField()
    audio = forms.CharField()

在views.py中,您可以使用初始表单数据定义表单集:

from django.forms import formset_factory
from myapp.forms import ItemForm

item = Items.objects.all()[0] # replace this with your actual query
languages = item.languages.split('||')
settings = item.settings.split('||')
audios = item.audio.split('||')
ItemFormSet = formset_factory(ItemForm, extra=len(languages))
formset = ItemFormSet(initial=[
    {'language': language,
     'setting': setting,
     'audio':audio,
    } for language, setting, audio in zip(languages, settings, audios)])

答案 1 :(得分:0)

也许您应该只考虑ChoiceFields