2013-08-01 8 views
7

Przygotowuję zestaw w python/django i muszę dynamicznie dodawać kolejne pola do formularza, gdy kliknięto przycisk. Formularz, nad którym pracuję, dotyczy mojej szkoły, zadając uczniom pytanie, kogo chcą ujawnić niektóre informacje akademickie, a przycisk pozwala im dodać więcej pól do wpisania członków rodziny/osób, które chcą ujawnić.Czy zestaw danych django, który dynamicznie dodaje pola, ma trwałe dane?

Mam przycisk działający do miejsca, w którym pojawiają się dodatkowe pola, i możesz dodać tyle, ile chcesz. Problem polega na tym, że dane, które wcześniej wprowadzono do już istniejących pól, zostaną usunięte. Jednak tylko rzeczy w zestawie zostaną usunięte. Wszystko inne, co zostało wypełnione wcześniej w formularzu, pozostaje trwałe.

Czy istnieje sposób, aby zestaw formalny zachować dane wprowadzone przed naciśnięciem przycisku?

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]) 

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) 

i 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') 

Z góry dziękuję!

Odpowiedz

7

miałem kłopoty z dynamiczne dodawanie pól w Django przed i to pomogło mi pytanie stackoverflow: dynamically add field to a form

szczerze mówiąc, nie jestem do końca pewien, co masz na myśli przez „trwałe” w danym przypadku - czy wartości twoich formularzy są usuwane podczas dodawania danych wejściowych? Czy na pewno nie jest to coś ze swoim JS?

+2

Co więcej, przyjazny komentarz do stylu: możesz chcieć, aby wszystkie pola w twoich modelach były małe. Przełączasz się między nimi a dużymi literami (np. "Nazwa" i "Data" dla modelu formularza) – Temuz

+0

Wartości w zestawie zostały usunięte. Oczywiście teraz, gdy zaczynam nagrodę, jeden z moich współpracowników wymyśla to dla mnie. –

+0

Właśnie zdałem sobie sprawę, że nigdy nie przyjąłem twojej odpowiedzi. Przepraszam za to! –

3

Próbowałem kiedyś coś takiego i zostałem skierowany do django-crispy-forms przez człowieka o wiele mądrzejszego niż ja. Nigdy nie dokończyłem projektu, więc nie mogę zaoferować więcej pomocy, ale może to być punkt wyjścia .

+0

To wielki baza wypadowa, jeśli zdecyduję się iść w tym kierunku, ale forma jest prawie wszystko zrobione, a wszystko czego brakuje to wytrwałość ... Miałem nadzieję, że będzie coś, co mógłbym zaimplementować, w przeciwieństwie do przepisywania całego formularza –

+0

Chciałbym móc pomóc. Będę sam oglądał to pytanie, ponieważ nigdy nie przeoczyłem tego punktu. – TylerLubeck

+0

po prostu rzuć go na upto i ulubionego i obejrzyjmy go! –

3

Mój współpracownik wreszcie to rozgryzł. Oto poprawione 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) 
    boolean = False 
    if request.POST:   
     Parent_formset = ParentFormSet(request.POST, prefix='Parent_or_Third_Party_Name') 
     if 'add' in request.POST: 
      boolean = True 
      list=[] 
      for i in range(0,int(Parent_formset.data['Parent_or_Third_Party_Name-TOTAL_FORMS'])): 
       list.append({'name': Parent_formset.data['Parent_or_Third_Party_Name-%s-name' % (i)], 'Relation': Parent_formset.data['Parent_or_Third_Party_Name-%s-Relation' % (i)]}) 
      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(): 
        (contobj, created) = Contact.objects.get_or_create(name=f.cleaned_data['name']) 
        (obj, created) = ParentForm.objects.get_or_create(student_name=form_instance, name=contobj, 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, 'boolean':boolean}) 
def submitted(request): 
    return render(request, 'content/design.html') 

Dziękuję za wejście, ci z was, którzy odpowiedzieli :)

Powiązane problemy