Pereiti prie turinio

Django: IndexError


Rekomenduojami pranešimai

Sveiki :) Iškilo klausimas dėl Django, tačiau SO niekas nepadeda, galbūt čią atsiras žmonių, galinčių pagelbėti ? Nupastinu savo užduotą klausimą:

 

Hello. I am a bit confused and I need some help.

 

I am displaying my objects using ModelFormset, then I am dynamically removing them using Ajax and then saving all of the objects again also using Ajax call. Everything is dynamic and the page is not reloaded at any time.

 

The problem is that when Django tries to save the whole formset using Ajax alfter an object or two has been deleted, it looks for the deleted object(s) and raises an `IndexError: list index out of range`, because the object(s) isn't at the queryset anymore.

 

This is how I am displaying and saving the formsets (simplified version - I think this is where the error comes from):

 

 

def App(request, slug):
   	TopicFormSet = modelformset_factory(Topic, form=TopicForm, extra=0, fields=('name',), can_delete=True)
   	SummaryFormSet = modelformset_factory(Summary, form=SummaryForm, extra=0, fields=('content',), can_delete=True)
   	tquery = user.topic_set.all().order_by('date')
   	squery = user.summary_set.all().order_by('date')
   	# saving formsets:
   	if request.method == 'POST' and request.is_ajax():
           # the following two lines is where the error comes from:
   		t_formset = TopicFormSet(request.POST) # formset instance
   		s_formset = SummaryFormSet(request.POST) # formset instance
   		s_formset.save()
   		t_formset.save()
   	return render (blah...)

 

This is how I am removing objects (this is a different view):

 

def Remove_topic(request, slug, id):
   	topic = Topic.objects.get(pk=id)
   	summary = Summary.objects.get(topic = topic) # foreign key relatonship

   	topic.delete()
   	summary.delete()

   	# Ajax stuff....
   	if request.is_ajax():
   		return HttpResponse('blah..')

 

I have tried placing `queryset = tquery` and `queryset = squery` when instantiating `t_formset` and `s_formset`, but it didn't help. What should I do ?

 

The error:

 

 

> File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 115, in get_response
       response = callback(request, *callback_args, **callback_kwargs)
     File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view
       return view_func(request, *args, **kwargs)
     File "/home/eimantas/Desktop/Projects/Lynx/lynx/views.py", line 122, in App
       t_formset = TopicFormSet(request.POST, queryset = tquery)
     File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 441, in __init__
       super(BaseModelFormSet, self).__init__(**defaults)
     File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py", line 56, in __init__
       self._construct_forms()
     File "/usr/local/lib/python2.7/dist-packages/django/forms/formsets.py", line 124, in _construct_forms
       self.forms.append(self._construct_form(i))
     File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 468, in _construct_form
       kwargs['instance'] = self.get_queryset()[i]
     File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 198, in __getitem__
       return self._result_cache[k]
   IndexError: list index out of range

Redagavo Dorian
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Jeigu kam įdomu, jei susidursit su panašia problema, štai kokį ats. gavau G+'e:

 

 

Neišeis, tiksliau labai sunku tai įgyvendinti taip kad būtų gerai visuose lygiuose. Nes ištrinti galima tiesiai duombazėj ir django nieko apie tai nesužinos.

Saugant formset'ą patariu įteruoti po vieną modelį ir atgal gražinti kiekvieno statusą ar pavyko išsaugoti.

 

Mano atsakymas:

 

Ačiū už atsakymą. Tačiau dabar viską pergalvojau ir kadangi noriu padaryti savo appsą panašų į Google docs (iš autosave pusės), tai kas 5 sec saugojant visą formsetą su n+ formų, spėju, bus labai apkrautas serveris. Tad geriau išvis atsisakysiu formsetų ir su Ajaxu saugosiu kiekvieną objektą atskirai (kai useris sutypins tam tikrą skaičių characterių, duosiu užklausą su Ajax į atitinkamą view).

 

Tai tiek :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...