【问题标题】:Django choices that change automatically based on male/female checkboxes. Categories will be displayed based on the gender choice根据男性/女性复选框自动更改的 Django 选项。类别将根据性别选择显示
【发布时间】:2020-03-13 17:49:11
【问题描述】:

我在互联网上搜索过,但没有找到合适的。我想要一个模型,该模型将具有一组类别选择,这些类别将根据选择的是男性还是女性复选框/选项(以更合适的为准)而改变。

在models.py中,

class MyModel(models.Model):

    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'),

    }

    # Male/Female option as either choices or checkboxes depending on whichever one is more suitable
    gender =

    # Either MALE_CATEGORIES or FEMALE_CATEGORIES
    # Depending on gender
    categories = models.CharField(max_length=18, choices=)

在forms.py中,

class MyModelForm(forms.ModelForm):

    class Meta:
        model = MyModel
        fields = [
            'gender',
            'categories',
        ]

【问题讨论】:

    标签: html django django-models django-forms


    【解决方案1】:

    我就是这样做的。它代表了使用 Django 和 JQuery 创建依赖下拉列表的基本方法。 在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'),
    ]
    

    定义了一个方法(get_all_choices)来追加和返回所有(MALE_CATEGORIES 和 FEMALE_CATEGORIES)选项,如下所示。调用该方法以将所有选项分配给类别字段 MyModel 的选项变量。

    def get_all_choices():
        all_choices = MALE_CATEGORIES
        all_choices+=FEMALE_CATEGORIES
    
        return all_choices
    
    class MyModel(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 MyModelForm(ModelForm):
    
        class Meta:
            model = MyModel
    
            fields = [
    
                'name',
                'gender',
                'category',
    
            ]
    

    通过将表单作为上下文(在本例中为 mymodelform)的某个视图呈现 html。 在我的html中,

    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
    
    
    <form class="form-class" action="" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {% for field in mymodelform %}
    
            <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2019-06-18
      相关资源
      最近更新 更多