【问题标题】:How to save a set of things over and over (autosave)如何一遍又一遍地保存一组东西(自动保存)
【发布时间】:2014-05-11 12:56:57
【问题描述】:

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

我想为 things 创建 set,然后使用 AJAX 一遍又一遍地更新所有 things(有点像自动保存) .在我的情况下,集合是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)

如果我的 URL 看起来像这样: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 对象只创建一次。

所以,换句话说。我正在填写表单集的表单,该表单集在单击“查看下一个表单”后会更新,这在我的模板中。

    $('.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']

【问题讨论】:

    标签: ajax django formset


    【解决方案1】:

    如果我的回答显得幼稚,请原谅我——我是 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
    

    【讨论】:

    • 这将使错误消失,但每次我尝试更新集合中的事物时,它都会创建一个全新的集合,每次都充满相同的事物。如果我的 URL 如下所示:127.0.0.1:8000/screen_many/?e_1=13&e_2=12&i_1=14 该视图创建了 3 个调查集,因为我对 AJAX 使用相同的视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2021-01-15
    • 1970-01-01
    • 2013-06-27
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多