2014-12-23 1 views
4

장고에서보기 및 확인란으로 항목을 삭제하는 방법을 설명하는 게시물을 여러 번 보았습니다. AJAX로 단일 항목 삭제를 완료했습니다. 현재 문제는 Django 응용 프로그램에서 여러 항목을 확인란과 AJAX로 삭제하는 방법을 알 수 없다는 것입니다.Django 및 AJAX : 여러 항목 wth 확인란을 삭제

원래 장고의 GCBV 인 DeleteView을 사용했으며 이는 단일 개체 삭제에 사용되었습니다. 그러나 @Craig Blaszczyk이 지적했듯이 DeleteView은 그저 하나의 객체를 삭제하는 것입니다. 그래서 나는 첨부 된 폼과 AJAX 호출을 가진 복수의 객체를 삭제하는 새로운 뷰를 작성하여 ids 배열을 전송해야한다.

나는이 일을하고 있지만 그것은 clunky 느낌이 아주 잘 작동하지 않습니다. 내 AJAX 스크립트는 여기에 있습니다 :이 스크립트에서

$.ajax({ 
    type: 'POST', 
    url: '/dashboard/images/delete/', 
    data: {'ids': ids}, 
    success: function() { 
     console.log(date_time + ": AJAX call succeeded."); 
    }, 
    error: function() { 
     console.log(date_time + ": AJAX call failed!"); 
     console.log(date_time + ": Image ID: " + ids + "."); 
    } 
}); 

(여기에 표시된 섹션 위에) 내가 ID의 배열을 구축하고 데이터로 보낼 수 있습니다. 내 CBV에 따라서

, 내가 선택한 ID를 수집하고이를 삭제 해요 :

class DeleteImagesForm(forms.Form): 
    ids = forms.ModelMultipleChoiceField(
     queryset=GalleryImage.objects.all(), 
     widget=forms.CheckboxSelectMultiple(), 
    ) 

될 수있는 더 좋은 방법은 무엇 : 여기

def post(self, request, *args, **kwargs):  
    form = self.form_class(request.POST) 
    GalleryImage.objects.filter(pk__in=request.POST.getlist('ids[]')).delete() 
    return render(request, self.template_name, {'form': form}) 

은 내가 사용 형태입니다 이러는거야? 아주 좋은 방법을 모색하지 않으면이 솔루션을 사용하지 못하게되었습니다.

또한 힘들다고 생각 되더라도 form.is_valid()과 통화하면 이미지를 삭제해야합니다.

현상금이 끝나기 전에 마지막으로 나온 단어는 무엇입니까?

답변

3

보기가 DeleteView이며 정의 상 하나의 항목에서만 작동합니다. 여러 항목을 삭제할 수 있으려면 새 View을 작성하는 것이 좋습니다. 삭제하려는 ID를 예상하는 양식이 있습니다. 양식의 ID를 반복하고 각 ID를 삭제하는 ProcessFormView을 작성할 수 있습니다.

class MyView(FormView): 
    form_class = MyForm 
    template_name = 'mytemplate.html' 

    def form_valid(self, form): 
     # Process your ids here 
     print form.cleaned_data['ids'] 
     # Prints [u'1', u'2'] 
     return super(MyView, self).form_valid(form) 

    def get_form_kwargs(self): 
     form_kwargs = super(MyView, self).get_form_kwargs() 
     query = Image.objects.all().values_list('id', flat=True) 
     form_kwargs['image_ids'] = [(image_id, image_id) for image_id in query] 
     return form_kwargs 

와 샘플 형상 :

class MyForm(forms.Form): 
    # This might be better as a ModelChoiecField 
    ids = forms.MultipleChoiceField()# 

    def __init__(self, image_ids, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['ids'].choices = image_ids 
+0

쿨 뷰에서

,이 DeleteView' 하나만 작동 '하는 것이 좋은 ... 좋은 지적입니다; 나는 내가 지금하고있는 것을 보여주기 위해 지금 코드를 추가하고 있었다. 귀하의 제안에 감사드립니다. 나는 이것을 밖으로 시험 할 것이다.빠른 견해, 내가이 견해를 작성했다면, 내가 제공 한 AJAX가 여전히 작동 할 것인가? – nicorellius

+0

아약스는 하나의 id 만 전송합니다. 'data : id' 비트를 참조하십시오. 대신 id 배열을 보내려면이를 변경해야합니다. –

+0

나는 한동안 이것을 고심하고 있었고 정확하게 조각들을 모으는 방법을 알 수 없었다. 나는 OP를 업데이트했다. 선호하는 방법을 제안하고 코드 시작 지점을 제공 할 수 있습니까? 원칙적으로 당신이 대답하는 것을 의미하는 것은 합리적입니다. 나는 그 조각들을 함께 모을 수 없다. – nicorellius

0

사용자가 체크 박스를 선택하고 하나 개의 어레이에서의 ID의 값을 저장하고, 입력 된 태그의 값에 해당 배열을 설정할 수있다 여기

은 샘플 뷰의 .

Ex.

function updateTextAreanew() { 
    var allVals = []; 
    $('.questions_checkbox :checked').each(function() { 
      allVals.push($(this).next().val()); 
    }); 
    $('.ups1').val(allVals); 

} 

$(function() { 
    $('.questions_checkbox input').click(updateTextAreanew); 

    updateTextAreanew(); 
}); 

여기서 우리는 체크 박스 클릭을 감지하고 allVals 배열의 값을 저장합니다.

이제 모든 id를 가진이 배열을 보시고 ajax를 사용하여 보시고 loop for view를 보시고 객체를 삭제하십시오.

@csrf_exempt 
def deleteitems(request): 
    newdata = request.user 
    profiledata = UserProfile.objects.get(user=newdata) 
    swid = request.POST.getlist('newval[]') # ajax post data (which have all id's of GalleryImage objects) 
    for one in swid: 
     obj = GalleryImage.objects.get(id=one).delete() 
    response = json.dumps({'data':'deleted'}) 
    return HttpResponse(response, mimetype="application/json") 
+0

이 부분에 문제가 없습니다. 나는 문제없이 ID를 얻고 삭제할 수있다. 내 문제는 장고 비트에있다 ... – nicorellius

+0

나는 당신의 요점을 가지고 있지 않았다. 장고 비트? – Gaurav

+0

일단 뷰의 ID 목록을 얻으면 해당 목록에서 루프를 실행할 수 있습니다. 편집 된 답변을 살펴보십시오. – Gaurav