Соединение двух моделей для создания выпадающего списка - PullRequest
0 голосов
/ 23 сентября 2019

Я хочу знать, как я могу соединить 2 модели, чтобы создать раскрывающийся список, который зависит друг от друга.

На момент написания, это мои модели для видео:

class AMLVideo(models.Model):

    LANGUAGE = (
        ('LAN', 'Language'),
        ('FR', 'French'),
        ('EN', 'English'),
        ('HIN', 'Hindi'),
        ('SPA', 'Spanish'),
        ('GER', 'German'),
    )

    LEVEL = (
        ('BEG', 'Beginner'),
        ('INT', 'Intermediary'),
        ('ADV', 'Advanced'),
    )

    CATEGORY = (
        ('ANI', 'Animal'),
        ('ENV', 'Environmental'),
        ('MOR', 'Moral'),
        ('FOLK', 'Folktales'),
        ('ADN', 'Adventure'),
        ('POE', 'Poems'),
        ('FUN', 'Funny'),
    )
    slug = models.SlugField(max_length=50, default='Enter-Slug-Here')
    level = models.CharField(max_length=100, choices=LEVEL, default='level', blank=True)
    language = models.CharField(max_length=100, choices=LANGUAGE, default='language', blank=True)
    category = models.CharField(max_length=100, choices=CATEGORY, default='category', blank=True)
    video = EmbedVideoField(verbose_name='Videos',
                        help_text='URL of Video')

    def __str__(self):
        return self.slug

    class Meta:
        verbose_name = "video"
        verbose_name_plural = "videos"

Это представления, которые уже показывают видео с использованием iframe

def home(request):
    videos = AMLVideo.objects.all()

    # Get category from filter
    category = request.GET.get('category', '')
    if category:
        videos = videos.filter(
            category__exact=category
        )

    # Get language from filter
    language = request.GET.get('language', '')
    if language:
        videos = videos.filter(
            language__exact=language
        )

    # Get level from filter
    level = request.GET.get('level', '')
    if level:
        videos = videos.filter(
            level__exact=level
        )

    videos = videos.order_by("-category", "-language", "-level")

    context = {'videos': videos}
    return render (request, 'home.html', context)

Теперь для раскрывающегося списка, я не совсем уверен, как показать его, используя модель или форму в шаблоне.

Я надеялся, что если пользователь выберет что-либо из раскрывающегося списка, то показанные видео будут основаны на раскрывающемся списке, выбранном пользователем.

Возможно ли это?

1 Ответ

1 голос
/ 23 сентября 2019

Вы можете справиться с этим, используя форму Django, которую вы можете отобразить в шаблоне, оставив значение фильтра для отправки в представление.Вот так:

forms.py

from django import forms

class AMLVideoFilterForm(forms.Form):
    LANGUAGE = (
        ('LAN', 'Language'),
        ('FR', 'French'),
        ('EN', 'English'),
        ('HIN', 'Hindi'),
        ('SPA', 'Spanish'),
        ('GER', 'German'),
    )

    LEVEL = (
        ('BEG', 'Beginner'),
        ('INT', 'Intermediary'),
        ('ADV', 'Advanced'),
    )

    CATEGORY = (
        ('ANI', 'Animal'),
        ('ENV', 'Environmental'),
        ('MOR', 'Moral'),
        ('FOLK', 'Folktales'),
        ('ADN', 'Adventure'),
        ('POE', 'Poems'),
        ('FUN', 'Funny'),
    )

    language = forms.ChoiceField(choices=LANGUAGE, widget=forms.Select(attrs={'onchange' : "this.form.submit()"}))
    level = forms.ChoiceField(choices=LEVEL, widget=forms.Select(attrs={'onchange' : "this.form.submit()"}))
    category = forms.ChoiceField(choices=CATEGORY, widget=forms.Select(attrs={'onchange' : "this.form.submit()"}))

views.py

def home(request):
    filter_form = AMLVideoFilterForm(request.GET)
    videos = AMLVideo.objects.all()

    # Get category from filter
    category = filter_form.data.get('category')
    if category:
        videos = videos.filter(
            category__exact=category
        )

    # Get language from filter
    language = filter_form.data.get('language')
    if language:
        videos = videos.filter(
            language__exact=language
        )

    # Get level from filter
    level = filter_form.data.get('level')
    if level:
        videos = videos.filter(
            level__exact=level
        )

    videos = videos.order_by("-category", "-language", "-level")

    context = {'videos': videos, 'filter_form': filter_form}
    return render (request, 'home.html', context)

home.html

<body>
...
    <form method="GET">
        {{ filter_form }}
    </form>

    {% for video in videos %}
        <p>Render your video here</p>
    {% endfor %}
...
</body>

Затем, когда вы изменяете выбор фильтра, он отправляет форму в метод GET.В представлении вам нужно получить фильтры в данных формы для фильтрации данных.Что касается виджетов, вы должны добавить событие onchange, чтобы каждый раз, когда пользователь изменял значение раскрывающегося списка, он отправлял форму для повторной фильтрации данных.Это альтернативный способ обработки без использования JavaScript или jQuery.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...