可以动态添加字段的django formset是否具有持久数据?

Rio*_*oof 8 python database django django-forms

我在python/django中制作一个formset,并且需要在单击按钮时动态地向formset添加更多字段.我正在处理的表格是让我的学校向学生询问他们想要披露某些学术信息,并且这里的按钮允许他们添加更多字段以输入他们想要透露给他们的家庭成员/人.

我让按钮工作到额外字段显示的位置,您可以添加任意数量的按钮.问题是,先前输入到现有字段的数据将被删除.但是,只有formset中的内容才会被删除.之前在表单中填写的所有其他内容都保持不变.

是否有任何方法可以使formset保留按下按钮之前输入的数据?

form.py:

from django import forms
from models import Form, ParentForm, Contact
from django.core.exceptions import ValidationError

def fff (value):
    if value == "":
        raise ValidationError(message = 'Must choose a relation', code="a")

# Create your forms here.
class ModelForm(forms.ModelForm):   
    class Meta:
        model = Form
        exclude = ('name', 'Relation',)

class Parent(forms.Form):
    name = forms.CharField()

    CHOICES3 = (    
    ("", '-------'),
    ("MOM", 'Mother'),
    ("DAD", 'Father'),
    ("GRAN", 'Grandparent'),
    ("BRO", 'Brother'),
    ("SIS", 'Sister'),
    ("AUNT", 'Aunt'),
    ("UNC", 'Uncle'),
    ("HUSB", 'Husband'),
    ("FRIE", 'Friend'),
    ("OTHE", 'Other'),
    ("STEP", 'Stepparent'),
    )
    Relation = forms.ChoiceField(required = False, widget = forms.Select, choices = CHOICES3, validators = [fff])
Run Code Online (Sandbox Code Playgroud)

models.py

from django.db import models
from django import forms
from content.validation import *
from django.forms.models import modelformset_factory

class Contact(models.Model):
    name = models.CharField(max_length=100)

class Form(models.Model):
    CHOICES1 = (
        ("ACCEPT", 'I agree with the previous statement.'),
        )
    CHOICES2 = (
        ("ACADEMIC", 'Academic Records'),
        ("FINANCIAL", 'Financial Records'),
        ("BOTH", 'I would like to share both'),
        ("NEITHER", 'I would like to share neither'),
        ("OLD", "I would like to keep my old sharing settings"),
        )

    Please_accept = models.CharField(choices=CHOICES1, max_length=200)
    Which_information_would_you_like_to_share = models.CharField(choices=CHOICES2, max_length=2000)
    Full_Name_of_Student = models.CharField(max_length=100)
    Carthage_ID_Number = models.IntegerField(max_length=7)
    I_agree_the_above_information_is_correct_and_valid = models.BooleanField(validators=[validate_boolean])
    Date = models.DateField(auto_now_add=True)
    name = models.ManyToManyField(Contact, through="ParentForm")

class ParentForm(models.Model):
    student_name = models.ForeignKey(Form)
    name = models.ForeignKey(Contact)

    CHOICES3 = (
    ("MOM", 'Mother'),
    ("DAD", 'Father'),
    ("GRAN", 'Grandparent'),
    ("BRO", 'Brother'),
    ("SIS", 'Sister'),
    ("AUNT", 'Aunt'),
    ("UNC", 'Uncle'),
    ("HUSB", 'Husband'),
    ("FRIE", 'Friend'),
    ("OTHE", 'Other'),
    ("STEP", 'Stepparent'),
    )
    Relation = models.CharField(choices=CHOICES3, max_length=200)
    def __unicode__(self):
        return 'name: %r, student_name: %r' % (self.name, self.student_name)
Run Code Online (Sandbox Code Playgroud)

和views.py

from django.shortcuts import render
from django.http import HttpResponse
from form import ModelForm, Parent
from models import Form, ParentForm, Contact
from django.http import HttpResponseRedirect
from django.forms.formsets import formset_factory

def create(request):
    ParentFormSet = formset_factory(Parent, extra=1)
    if request.POST:        
        Parent_formset = ParentFormSet(request.POST, prefix='Parent_or_Third_Party_Name')
        if 'add' in request.POST:
            list=[]
            for kitties in Parent_formset:
                list.append({'Parent_or_Third_Party_Name-0n-ame': kitties.data['Parent_or_Third_Party_Name-0-name'], 'Parent_or_Third_Party_Name-0-Relation': kitties.data['Parent_or_Third_Party_Name-0-Relation']})
            Parent_formset = ParentFormSet(prefix='Parent_or_Third_Party_Name', initial= list)
        form = ModelForm(request.POST)
        if form.is_valid() and Parent_formset.is_valid():
            form_instance = form.save()

            for f in Parent_formset:
                if f.clean():
                    (obj, created) = ParentForm.objects.get_or_create(name=f.cleaned_data['name'], Relation=f.cleaned_data['Relation'])

            return HttpResponseRedirect('http://Google.com')
    else:
        form = ModelForm()
        Parent_formset = ParentFormSet(prefix='Parent_or_Third_Party_Name')

    return render(request, 'content/design.html', {'form': form, 'Parent_formset': Parent_formset})
def submitted(request):
    return render(request, 'content/design.html')
Run Code Online (Sandbox Code Playgroud)

先感谢您!

Tem*_*muz 7

我之前在Django中动态添加字段时遇到了麻烦,这个stackoverflow问题帮助了我: 动态地向表单添加字段

老实说,我并不完全确定你的意思是"持久"是什么意思 - 当你添加输入时,表单的值是否会被移除?你确定它不是你的JS吗?

  • 另外,对样式的友好评论:您可能希望使模型中的所有字段都为lowercase_underscore.您在它和大写之间切换(例如,您的表单模型的"名称"和"日期") (2认同)