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

在Django中,如何向JQuery发送上下文或变量?,jquery,html,django,django-models,django-forms,Jquery,Html,Django,Django Models,Django Forms,我有一个模特儿,必须使用模特儿表格PersonForm输入。 models.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 C

我有一个模特儿,必须使用模特儿表格PersonForm输入。 models.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)
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)
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中,您可以访问如下上下文变量:

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

在jQuery中,您可以访问如下上下文变量:

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

解决了。我需要在上下文变量中以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>

解决了。我需要在上下文变量中以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>

您可以将类别选项作为上下文变量发送。并且可以在JQuery中轻松访问它。我以前在JQuery中尝试过访问上下文变量,但没有成功。您可以展示一个示例语法吗?您可以将类别选项作为上下文变量发送。并且可以在JQuery中轻松访问它。我以前在JQuery中尝试过访问上下文变量,但没有成功。你能展示一个示例语法吗?不幸的是,这个方法不适合我。它产生一些随机的选择集,由我的实际选择中的字母组成。你从你的视图中发送的男性和女性类别是一个列表还是一个元组列表?您是否能够在jQuery中console.log这两个变量?我尝试以两个元组列表的形式发送:context['male_categories']=male_categories context['male_categories']=male_categories字符串列表:male_categories_List=['male categories 1','male categories 2','male categories 3']['女性类别1'、'女性类别2'、'女性类别3']上下文['男性类别]]=男性类别列表上下文['女性类别']=female\u category\u list您能在javascript控制台中记录变量吗?我记录了变量,它显示两个列表都被解释为各自列表中所有字符的列表,而不是字符串列表。示例:-雄类被解释为列表中每个字符串中所有字符的列表,连同“[”,“]'和一些其他字符表示单引号和逗号。不幸的是,此方法不适用于我。它会生成一些随机的选择集,由我实际选择的字母组成。您从视图中发送的男性和女性类别是仅列表还是元组列表?您是否能够console.log这两个变量bjQuery中的les?我尝试以两个元组列表的形式发送:context['male_categories']=male_categories context['female_categories']=male_categories字符串列表:male_categories_List=['male categories 1'、'male categories 2'、'male categories categories 3']['male_categories']=male_categories_列表上下文['female_categories']=female\u category\u list您能在javascript控制台中记录变量吗?我记录了变量,它显示两个列表都被解释为各自列表中所有字符的列表,而不是字符串列表。示例:-雄类被解释为列表中每个字符串中所有字符的列表,以及“[”、“]”和其他一些用于单引号和逗号的字符。