Django вариантов, которые изменяются автоматически в зависимости от флажков для мужчин и женщин. Категории будут отображаться в зависимости от пола - PullRequest
0 голосов
/ 13 марта 2020

Я искал по inte rnet, но не нашел ничего подходящего. Я хочу иметь модель, которая будет иметь набор вариантов категорий, которые будут меняться в зависимости от того, выбран ли мужской или женский флажок / выбор (в зависимости от того, что более подходит).

В 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=)

In Forms.py,

class MyModelForm(forms.ModelForm):

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

1 Ответ

0 голосов
/ 22 марта 2020

Вот как я это сделал. Он представляет базовый c метод для создания зависимого выпадающего списка с использованием 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',

        ]

Отрисовать html через некоторое представление с формой в качестве контекста (в данном случае mymodelform). По моему 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>
...