2013-08-01 5 views
7

मैं अजगर/डीजेंगो में एक फॉर्मेट बना रहा हूं और बटन को क्लिक करने के रूप में एक फॉर्मेट में गतिशील रूप से अधिक फ़ील्ड जोड़ने की आवश्यकता है। जिस फॉर्म पर मैं काम कर रहा हूं वह मेरे स्कूल के लिए छात्रों से पूछता है कि वे कुछ अकादमिक जानकारी का खुलासा करना चाहते हैं, और यहां बटन उन्हें परिवार के सदस्यों/लोगों को दर्ज करने के लिए और अधिक फ़ील्ड जोड़ने की अनुमति देता है, जिन्हें वे प्रकट करना चाहते हैं।क्या एक django प्रारूप जो गतिशील रूप से फ़ील्ड जोड़ता है, लगातार डेटा हो सकता है?

मेरे पास उस बिंदु पर काम करने वाला बटन है जहां अतिरिक्त फ़ील्ड दिखाई देते हैं, और आप जितनी चाहें उतनी जोड़ सकते हैं। समस्या यह है कि पहले से मौजूद मौजूदा फ़ील्ड में दर्ज किया गया डेटा हटा दिया जाता है। हालांकि, फ़ॉर्मेट में केवल चीजें हटा दी जाती हैं। सब कुछ जो पहले फॉर्म में भर गया था, लगातार रहता है।

क्या फ़ॉर्मेट को दबाए जाने से पहले दर्ज किए गए डेटा को रखने का कोई तरीका है?

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) 

और 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') 

अग्रिम धन्यवाद!

उत्तर

7

मैं के साथ परेशानी लिया है गतिशील रूप से पहले Django में फ़ील्ड जोड़ने और इस stackoverflow सवाल मुझे मदद मिली: dynamically add field to a form

ईमानदारी से कहूं तो मैं पूरी तरह से सुनिश्चित करें कि आप अपने मामले में "लगातार" द्वारा क्या मतलब है नहीं कर रहा हूँ - जब आप इनपुट जोड़ते हैं तो आपके रूपों के मूल्य हटा दिए जाते हैं? क्या आप वाकई अपने जेएस के साथ कुछ नहीं कर रहे हैं?

+2

इसके अलावा, शैली पर दोस्ताना टिप्पणी: आप अपने मॉडल में सभी फ़ील्ड को lowcase_underscore बनना चाह सकते हैं। आप उस फॉर्म और कैपिटल के बीच स्विच कर रहे हैं (उदाहरण के लिए "फॉर्म" और "फॉर्म" आपके फॉर्म मॉडल के लिए) – Temuz

+0

फ़ॉर्मेट में मान हटाए जा रहे थे। बेशक, अब जब मैं अपने सहकर्मियों में से एक उपहार प्राप्त करता हूं तो यह मेरे लिए बाहर निकलता है –

+0

बस एहसास हुआ कि मैंने कभी आपका जवाब स्वीकार नहीं किया है। उसके लिए माफ़ करना! –

3

मैं एक बार ऐसा करने की कोशिश कर रहा था, और मुझे django-crispy-forms पर निर्देशित किया गया था। मैंने कभी परियोजना को समाप्त नहीं किया है, इसलिए मैं उससे अधिक सहायता नहीं दे सकता, लेकिन यह एक शुरुआती बिंदु हो सकता है ।

+0

बिंदु एक महान कूद बंद है यही कारण है कि अगर मैं उस दिशा में जाने का निर्णय जवाब आप में से जो है, लेकिन रूप है: यहाँ संशोधित views.py है बहुत ज्यादा बनाया गया है, और जो कुछ भी गुम है, वह दृढ़ता है ... मैं उम्मीद कर रहा था कि मैं कुछ ऐसा करूँगा जो मैं अभी लागू कर सकता हूं, पूरे फॉर्म को फिर से लिखने के विपरीत –

+0

इच्छा है कि मैं और मदद कर सकता हूं। मैं इस सवाल को खुद देख रहा हूं, क्योंकि मैं इस बिंदु से पहले कभी नहीं मिला था। – TylerLubeck

+0

बस इसे एक अपवित्र और एक पसंदीदा फेंक दो और चलो इसे देखते हैं! –

3

अंत में मेरे एक सहकर्मी ने इसे समझ लिया।

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

अपने इनपुट के लिए धन्यवाद, जो :)

संबंधित मुद्दे