如何一遍又一遍地保存一组东西(自动保存)

时间:2014-03-31 23:38:17

标签: ajax django formset

我正在使用表单直接创建一个一组东西(每个东西都有FK到集合中)。我遇到的问题是视图。

我想为事物创建设置,然后使用AJAX反复更新所有事物(有点像自动保存) 。在我的情况下,集合是SurveySet,而事物是Survey

def screen_many(request):

    if not request.is_ajax():

        # get an ordered QuerySet of students
        students = ids_to_students(request.GET.items())
        e_students = ids_to_students(request.GET.items(), 'e')
        i_students = ids_to_students(request.GET.items(), 'i')
        survey_count = len(students)

        # Build a dataset of students with there associated behavior types.
        data =  [{'student':s.pk, 'behavior_type': 'E'} for s in e_students]
        data += [{'student':s.pk, 'behavior_type': 'I'} for s in i_students]

        # Use that dataset as initial data for a formset
        SurveyFormset = formset_factory(SurveyForm, extra=0)
        survey_formset = SurveyFormset(initial=data)

        # ... not shown: customizing the crispy form helper

        # Make a new survey set...
        ss = SurveySet()
        ss.user=request.user
        ss.save()

    if request.is_ajax():
        surveyset = get_object_or_404(SurveySet, pk=ss.pk)
        surveys = surveyset.survey_set.all()

        survey_formset = SurveyFormset(request.POST, instance=surveyset)
        if survey_formset.is_valid():
            # Create surveys for this surveyset
            for form in survey_formset.forms:
                saved = form.save(commit=False)
                saved.surveyset = ss
                saved.save()

        HttpResponse('saved.')


    formsetWithStudents = zip(survey_formset.forms, students)

    c = {
         'formsetWithStudents' : formsetWithStudents,
         'students' : students,
         'survey_count' : survey_count,
         'e_students': e_students,
         'i_students': i_students,
         'survey_formset': survey_formset,
        }
    c.update(csrf(request))

    return render_to_response("reports/screen_many.html", c)

如果我的网址如下所示:http://127.0.0.1:8000/screen_many/?e_1=13&e_2=12&i_1=14该视图会在抱怨有

的同时制作3个调查集

UnboundLocalError at /screen_many/ local variable 'ss' referenced before assignment

我觉得我需要为ajax创建一个单独的视图,我希望SurveySet对象只能创建一次。

换句话说,所以,换句话说。我正在填写一个formset的形式,点击&#34后更新;查看下一个表格"这是在我的模板中。

    $('.next').click(function(){
        $(this).parent().hide()
        $(this).parent().next().show()

        var posting = $.post('/screen_many/', $('form').serializeArray() );

        posting.done(function(response){
            console.log(response)
    });

或者我可以在这里发送POST数据:

def save_as_you_go(request):
    if request.is_ajax():
        # Get the surveyset from POST
        ss = request.POST['form-0-surveyset']
        surveyset = get_object_or_404(SurveySet, pk=ss)
        surveys = surveyset.survey_set.all()
        SurveyFormSet = inlineformset_factory(SurveySet, Survey, form=SurveyForm, can_delete=False, extra=0)
        survey_formset = SurveyFormSet(request.POST, instance=surveyset)

        if survey_formset.is_valid():
            for form in survey_formset.forms:
                student = form.save(commit=False)
                student.surveyset = surveyset
                student.save()
        return HttpResponse('saved.')
    else:
        return HttpResponseRedirect('/')

但后来我

[u'ManagementForm data is missing or has been tampered with']

1 个答案:

答案 0 :(得分:0)

请原谅我,如果我的回答看起来很幼稚 - 我是Python和Django的新手,但看起来你在非ajax请求中设置ss变量,然后在ajax请求中引用它。也许你可以在if语句之前设置ss?

    #set ss variable before if statements
    ss = SurveySet()
    ss.user=request.user
    ss.save()

    if not request.is_ajax():
    ###do your non-ajax request stuff
    if request.is_ajax():
    ###do your ajax request stuff