2012-09-13 32 views
7

Kullanıcıların, formları dinamik olarak django form kümelerine ekleyip silebilecekleri bir web sayfam var.Dinamik Form formunu silme formu django

Formları dinamik olarak bir form setine ekleyebileceğim, Dynamically adding a form to a Django formset with Ajax okudum. Şimdi formset'i dinamik olarak silmek istiyorum. Dynamically Delete inline formsets in Django

'a baktığım gibi Bunu yapmak istediğim şey, kullanıcının silme tıklaması olduğunda, form örneği kaydını veritabanından silen bir ajax işlevine sahibim. Ajax işlevim döndüğünde, aynı total_form_count ve initial_form_count değerlerini saklıyorum ve sadece silinen kayıt POST'umda gönderilmek üzere form html'sini gizlerim.

Başlangıçta Formset olarak form öğeleri vermektedir: Şimdi dinamik sicilim silindikten sonra, ben formu sayımları değişmez ajax kullanarak, formunu 0 silmek varsayalım

#form0 
<input id="id_formprefix-0-id" type ="hidden "value="something" name="formprefix-0-id"> 
<input id="id_formprefix-0-field" value="something" type="text" name="formprefix-0-field"> 
#form1 
<input id="id_formprefix-1-id" type ="hidden "value="something" name="formprefix-1-id"> 
<input id="id_formprefix-1-field" value="something" type="text" name="formprefix-1-field"> 
#form2 
<input id="id_formprefix-2-id" type ="hidden "value="something" name="formprefix-2-id"> 
<input id="id_formprefix-2-field" value="something" type="text" name="formprefix-2-field"> 

, böylece total_form_count ve initial_form_count 3.

(Bu durumda total_form_count ve initial_form_count öğelerini 2'ye indirirseniz, POST verilerini kullanarak benim formumda formumu doldurduğumda, form0 ve form1 olarak sipariş vermesi beklenir. formlar form1 ve form2'dir)

Şimdi benim görüşüme göre, formumu kaydetmek için aşağıdaki gibi bir şey yapıyorum. Ben herhangi bir kaydı silmeden benim formset kaydettiğinizde

myformset = modelformset_factory(ObjectElement,form=Object_Form, extra=0, can_delete=True) 
for form in myformset.forms: 
    print(form.instance.id) #this does not print id of deleted record, but of the first existing record in the database. 
    print(form.instance.attribute)# this prints the correct element, which was submitted by POST even for a deleted record. 
    try: 
     objectInstance = ObjectElement.objects.get(id = form.instance.id) 
     objectInstance.save() 
    except ObjectElement.DoesNotExist: 
     print("Do not save as the record has already been deleted")  

tasarrufu Tamam çalıştığını ve doğru form.instance.id basılır. Ancak, ajax kullanarak bir form örneğini silip form kümemi kaydetmeyi denediğimde, silinen kayıt için print(form.instance.id) veritabanında ilk kullanılabilir kimliği yazdırıyor, ancak postayla gönderilen kimliği yazdırmıyor gibi görünüyor. (Kayıt silindiğinde, kimlik veritabanında bulunmaz, ancak POST aracılığıyla kendisine gönderilenleri yazdırması gerekir mi?)

Deneme/yakalama döngüsü olmadan bunu yaparsam, aşağıdaki hatayı alıyorum: form.errors:

doğru biçimli kimliği silinmiş kayıt için gönderilen yazı oluşturacak kabul etmiyor belirtmek görünüyor
<ul class="errorlist"><li>id<ul class="errorlist"><li>Select a valid choice. That choice is not one of the available choices.</li></ul></li></ul> 

.

Burada herhangi bir bedende neyi kaçırdığım hakkında bir fikrim var mı? Ya da bunu yapmanın daha iyi bir yolu.

Nasıl formların sırası sıralı olması gerektiğini görünüyor biz yaklaşık dinamik, formsets gelen formlar silme gitmek için ..

Teşekkür peşin !! Herhangi bir yardım takdir edilir.

cevap

9

Bu sorunla karşılaşan kullanıcılar için bu olası bir çözüm olabilir Formumumu dinamik olarak aşağıdaki gibi form kümesinden silebiliyorum.

#form0 
<input id="id_formprefix-0-id" type ="hidden "value="something" name="formprefix-0-id"> 
<input id="id_formprefix-0-field" value="something" type="text" name="formprefix-0-field"> 
#form1 
<input id="id_formprefix-1-id" type ="hidden "value="something" name="formprefix-1-id"> 
<input id="id_formprefix-1-field" value="something" type="text" name="formprefix-1-field"> 
#form2 
<input id="id_formprefix-2-id" type ="hidden "value="something" name="formprefix-2-id"> 
<input id="id_formprefix-2-field" value="something" type="text" name="formprefix-2-field"> 

Şimdi ajax kullanarak benim veritabanından form0 ve form1 kayıtlarını silmek varsayalım gibi

Yani ilk formu html görünüyor. Formu teslim ettiğimde, form kümesi sırayla beklediğinden ve yalnızca veri tabanında kalan form 2'ye sahip olduğum için (en üstteki ikisini sildim) formset doğrulanmayacaktır.Sorunda açıklandığı şekilde "Geçerli bir seçim yap" ifadesini içeren Formset hataları.

Formları dinamik olarak sildiğimde, ajax'ım döndüğünde, total_form_count, (https://docs.djangoproject.com/en/1.4/topics/forms/formsets/#understanding-the-managementform) değiştirmeyin, ancak formumu html'de işaretli olarak işaretleyin ve sadece formu gizleyin. Artık, formset POST kullanılarak gönderildiğinde, silinen formu da gönderir, ancak silinmiş olarak işaretlenmiş (https://docs.djangoproject.com/en/1.4/topics/forms/formsets/#can-delete)

Şimdi görünümde, önce silinmiş formları filtreliyorum ve yalnızca formları işleyin. aşağıdaki gibi kalır:

+0

Her formu silmek için tam olarak nasıl işaretlersiniz? – amchugh89

+0

@ amchugh89 Öyleyse, o zaman ben de baktım (https://docs.djangoproject.com/en/1.4/topics/forms/formsets/#can-delete). Ancak [daha yeni sürümler] (https://docs.djangoproject.com/en/1.7/topics/forms/formsets/#understanding-the-managementform) "form - # - DELETE" yazısını dahil ederek silme işlemini işaretleyebilirsiniz. veri. – akotian