在 Django 中,如何将上下文或变量发送到 JQuery?

Posted

技术标签:

【中文标题】在 Django 中,如何将上下文或变量发送到 JQuery?【英文标题】:In Django, how to send context or variables to JQuery? 【发布时间】:2020-07-05 06:29:08 【问题描述】:

我有一个必须使用 ModelForm (PersonForm) 输入的模型(Persons)。 模型.py,

GENDER_CHOICES = [
    ('Male', 'Male'),
    ('Female', 'Female'),
]

MALE_CATEGORIES = [
    ('Male Category 1', 'Male Category 1'),
    ('Male Category 2', 'Male Category 2'),
    ('Male Category 3', 'Male Category 3'),
]

FEMALE_CATEGORIES = [
    ('Female Category 1', 'Female Category 1'),
    ('Female Category 2', 'Female Category 2'),
    ('Female Category 3', 'Female Category 3'),
]

def get_all_choices():
    all_choices = MALE_CATEGORIES
    all_choices+=FEMALE_CATEGORIES

    return all_choices

class Person(models.Model):
    name = models.CharField(max_length=50, unique=True)
    gender = models.CharField(max_length=7, choices=GENDER_CHOICES)
    category = models.CharField(max_length=20, choices=get_all_choices())

forms.py,

class PersonForm(ModelForm):

    class Meta:
        model = Person

        fields = [

            'name',
            'gender',
            'category',

        ]

views.py,

def personform_page(request):

    context = 

    if request.method == 'POST':
        personform = PersonForm(request.POST)

        if personform.is_valid():
            personform.save()
            return redirect('personform_page')

        context['personform'] = personform

    else:
        personform = PersonForm()
        context['personform'] = personform

    context['male_categories'] = MALE_CATEGORIES
    context['female_categories'] = FEMALE_CATEGORIES

    return render(request, 'app1/personform_page.html', context=context)

PersonForm 有一个相关的下拉列表,其中的类别选择将取决于所选的性别。 目前,我正在对 JQuery 中的类别选择进行硬编码,如下所示: personform_page.html,

<form class="form-class" action="" method="post" enctype="multipart/form-data">
    % csrf_token %
    % for field in personform %

        <p>
             field.label_tag 
             field 

            % if field.help_text %

                <small style="color: black;">  field.help_text  </small>

            % endif %

            % for error in field.errors %

                <p style="color: red;">  error  </p>

            % endfor %

        </p>

    % endfor %

    <button class="btn btn-outline-primary" type="submit">Join</button>

</form>

<script>

    $(document).ready( function() 

        $("#id_category").hide();

        $("#id_gender").on('change', function()

            var gender = $("#id_gender").val();

            if(gender == 'Male')

                $('#id_category').empty();
                $("#id_category").show();

                var maleCategories = ['Male Category 1', 'Male Category 2', 'Male Category 3'];
                var length = maleCategories.length;

                var i;
                for(i=0; i < length; i++)
                    maleCategory = maleCategories[i];
                    $('#id_category').append(

                        `
                        <option value="$maleCategory">
                            $maleCategory
                        </option>
                        `

                    );
                

            
            else if(gender == 'Female')

                $('#id_category').empty();
                $("#id_category").show();

                var femaleCategories = ['Female Category 1', 'Female Category 2', 'Female Category 3'];
                var length = femaleCategories.length;

                var i;
                for(i=0; i < length; i++)
                    femaleCategory = femaleCategories[i];
                    $('#id_category').append(

                        `
                        <option value="$femaleCategory">
                            $femaleCategory
                        </option>
                        `

                    );
                

            
            else

                $('#id_category').empty();

            

        );

    );

</script>

如何将类别选择发送到 JQuery 而无需对其进行硬编码?我需要将它们作为上下文发送还是使用其他东西?

【问题讨论】:

您可以将类别选择作为上下文变量发送。并且可以在 jQuery 中轻松访问它 我之前尝试在我的 JQuery 中访问上下文变量但没有成功。你能展示一个示例语法吗? 【参考方案1】:

在您的 jQuery 中,您可以像这样访问上下文变量:

var maleCategories = 'male_categories';
var femaleCategories = 'female_categories';

【讨论】:

不幸的是,这种方法对我不起作用。它会产生一些随机的选择集,由我实际选择的字母组成。 您发送的男性和女性类别是仅列表还是元组列表?你能在 jQuery 中 console.log 这两个变量吗? 我尝试同时发送两个元组列表:context['male_categories'] = MALE_CATEGORIES context['female_categories'] = FEMALE_CATEGORIES 字符串列表:male_category_list = ['Male Category 1', 'Male Category 2', 'Male Category 3'] female_category_list = ['Female Category 1', 'Female Category 2', 'Female Category 3'] context['male_categories'] = male_category_list context['female_categories'] = female_category_list 你能在javascript控制台中记录变量吗? 我记录了变量,它显示两个列表都被解释为各自列表中存在的所有字符的列表,而不是字符串列表。示例:-male_categories 被解释为列表中每个字符串中所有字符的列表,以及 '[', ']' 和其他一些用于单引号和逗号的字符。【参考方案2】:

解决了。我需要将类别变量作为 JSON 字符串发送到我的上下文变量中。 在views.py中,

from django.shortcuts import render, redirect

from .forms import PersonForm

import json

def personform_page(request):

    context = 

    if request.method == 'POST':
        personform = PersonForm(request.POST)

        if personform.is_valid():
            personform.save()
            return redirect('personform_page')

        context['personform'] = personform

    else:
        personform = PersonForm()
        context['personform'] = personform

    male_category_list = ['Male Category 1', 'Male Category 2', 'Male Category 3']
    female_category_list = ['Female Category 1', 'Female Category 2', 'Female Category 3']

    json_male_categories = json.dumps(male_category_list)
    json_female_categories = json.dumps(female_category_list)

    context['json_male_categories'] = json_male_categories
    context['json_female_categories'] = json_female_categories

    return render(request, 'app1/personform_page.html', context=context)

然后在我的脚本中,

<script>
    var json_male_categories = JSON.parse(' json_male_categories | escapejs ');
    var json_female_categories = JSON.parse(' json_female_categories | escapejs ');
</script>

在脚本中适当位置的以下分配之后,其余部分将保持原样。

    var maleCategories = json_male_categories;
    var femaleCategories = json_female_categories;

【讨论】:

以上是关于在 Django 中,如何将上下文或变量发送到 JQuery?的主要内容,如果未能解决你的问题,请参考以下文章

Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?

如何从 Django 模型(覆盖)save() 函数向视图发送警报或消息?

我将如何在 Django 模板标签中使用模板上下文变量的值? [复制]

如何将上下文变量与 Django 模板中的 SQL ID 进行比较?

如何列出所有可用的上下文变量?

如何在 Django 中放置指向网站主页的链接/网址?