如何将jQuery滑块的值保存到Person模型中?

时间:2015-05-31 21:57:46

标签: jquery django django-models django-forms django-views

我正在尝试将我添加到SurveyWizardForm的jQuery元素的值保存到我的class Person(models.Model):中,因此保存在我的数据库中。

我的表单中的所有其他元素都是以正常方式创建的,方法是在forms.py中创建必要的字段和小部件,并在models.py中创建每个问题的数据。因此,它们都会自动运行并保存正确的数据。

但是我已经在某些页面上自定义了SurveyWizardForm,以允许用户通过jQuery滑动条为图像提交评级。

我的问题是我似乎无法将此值存储在我的Person模型中。

问题:如何在我的Person模型中将滑块的值存储到slider_value

到目前为止,我所有的尝试都只是在模型/数据库中创建了一个新条目,它不存储我在Form / views.py中的值。我担心我没有正确地将这两个部分连接在一起。

非常感谢任何帮助。感谢

到目前为止我的代码

slider_two.js

这会使用my jQuery滑动条的值

更新隐藏的表单字段hidden1
  if($(this).attr("id") ==  "one")
      $("#hidden1").val((ui.value > 0 ? '+' : '') + ui.value);

wizard_form.html

当用户移动上面value="0"(未显示)中创建的滑块时,

slider_two.js会更新

<input type="hidden" name="slider_value" value="0" id="hidden1"/>                           

<script src="{% static "survey/js/slider_two.js" %}"></script>

views.py

我可以使用

将值读入views.py.
 slider_value = self.request.POST.get('slider_value')
 if slider_value is not None:                
     instruction_task_values.insert(0, slider_value) 

 logger.debug('\n\n\nThis is your instruction_task_values in 1 %s', instruction_task_values)

这适用于每次打印到我的日志

时正确的值

models.py

这意味着在DB中创建字段以存储滑块的值。我创建的所有其他条目都正常工作并保存。

class Person(models.Model): 
    slider_value = models.IntegerField(null=True, blank=True, max_length=1000)

forms.py

这是我认为我的问题所在。

以下是我尝试连接&#34;到我的表单中的现有slider_value并将其添加到我的Person模型中,但它所做的只是在我的表单中创建一个新的fiel。

class SurveyFormIT1(forms.ModelForm):      
    class Meta:
        model = Person    
        fields = ['slider_value']
        widgets = {'slider_value' : forms.HiddenInput}    

3 个答案:

答案 0 :(得分:2)

您应该考虑将代码正确修改为work with forms

例如,在 views.py

def my_view(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = SurveyFormIT1(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            slider_value = form.cleaned_data['slider_value']
            if slider_value is not None:    
                instruction_task_values.insert(0, slider_value)
            logger.debug('\n\n\nThis is your instruction_task_values in 1 %s', instruction_task_values)
            # redirect to a new URL:
            return HttpResponseRedirect('/thanks/')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = SurveyFormIT1()

    return render(request, 'wizard_form.html', {'form': form})

wizard_form.html

{{ form.as_p }}
<script src="{% static "survey/js/slider_two.js" %}"></script>

{{ form.as_p }}会给你一些类似

的内容
<input type="hidden" name="slider_value" value="" id="id_slider_value"/>

答案 1 :(得分:1)

你应该做这样的事情

if request.method == 'POST':
form = SurveyFormIT1(request.POST)
if form.is_valid():
    survey=form.save(commit=False)
    survey.slider_value=form.cleaned_data['slider_value']
    survey.save()

首先,您应检查您的请求中是否获得了正确的值,一旦拥有它,您只需手动保存它,就像上面的示例一样。您还应该从表单中排除slider_value字段,因为在将正确的值传递给它之前它将无效。

我知道有更优雅的解决方案,但这个很容易理解。

希望这有帮助

答案 2 :(得分:1)

我最终找到了解决这个问题的方法。

最重要的问题是我试图将信息添加到我的个人模型中,而这些信息并非生成/发起的。以我的forms.py / models.py传统方式,而不是生成&#39;在我的jQuery脚本的页面上。

我知道我必须创建一个模型字段和相应的表单字段来获取该值。最初我相信我应该将此值发送给我的views.py(如上所述)。这是错误的。

当我从SessionWizardView / form_wizard检查输出的html页面时,我意识到即使我已经调用了每个表单字段,例如field = ['slider_one_value']它被渲染出来,例如。

<input id="id_9-slider_one_value" type="hidden" name="9-slider_one_value" value="-37"></input>

正在调查的第九页上添加id_9-

因此,如果我修改了我的jQuery以在发送到我的视图的主隐藏字段的同时更新此字段,则该值将自动存储到我的模型中

最好的部分是我可以从同一个脚本

更新所需的这些字段

我希望这有助于其他人

我的代码

<强> wizard_form.html

这会调用我的slider_two.js脚本

<script src="{% static "survey/js/slider_two.js" %}"></script>

<强> slider_two.js

在页面上创建一个用户可以移动的滑块。然后它会更新结果和发送到视图的隐藏字段

它还会更新新创建的隐藏字段,这些隐藏字段与通过SessionWizardView渲染后在模型中创建的字段相对应

$('#submit').click(function() {
    var username = $('#hidden').val();
    if (username == "") username = 0;
    $.post('comment.php', {
        hidden: username
    }, function(return_data) {
        alert(return_data);
    });
});

$(".slider").slider({
    animate: true,
    range: "min",
    value: 0,
    min: -100,
    max: +100,
    step: 1,

    //This updates the slider-result below the slider bar so the participant can see their rating
    slide: function(event, ui) { 
      $("#slider-result").html((ui.value > 0 ? '+' : '') + ui.value);

    //This updates the hidden form field which is read by my views.py
    if($(this).attr("id") ==  "one")
        $("#hidden1").val((ui.value > 0 ? '+' : '') + ui.value);

    //This updates the id_9-slider_one_value form field which matches the name of fields = ['slider_one_value'] after it has been rendered
    if($(this).attr("id") ==  "one")
        $("#id_9-slider_one_value").val(ui.value);  

    //This updates the id_10-slider_two_value form field which matches the name of fields = ['slider_one_value'] after it has been rendered
    if($(this).attr("id") ==  "one")
        $("#id_10-slider_two_value").val(ui.value); 


    ....

    // Update as many hidden forms fields as necessary

    }
});

<强> models.py

在数据库中创建条目以存储值

slider_one_value = models.SmallIntegerField(null=True, max_length=100, blank=True) 
slider_two_value = models.SmallIntegerField(null=True, max_length=100, blank=True) 

<强> forms.py

创建隐藏的表单字段以从jQuery脚本中获取值

class SurveyFormF1(forms.ModelForm):      
    class Meta:
        model = Person       
        fields = ['slider_one_value']
        widgets = {'slider_one_value' : forms.HiddenInput}   

class SurveyFormF2(forms.ModelForm):        
    class Meta:
        model = Person        
        fields = ['slider_two_value']
        widgets = {'slider_two_value' : forms.HiddenInput}