在djang中创建下拉按钮

2024-04-20 11:30:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在想如何在Django中实现下拉按钮,但还没有找到有效的方法。你知道吗

我创造的是:

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

    title = models.CharField(max_length=100, default=None)
    level = models.CharField(max_length=100, choices=LEVEL)
    language = models.CharField(max_length=100, choices=LANGUAGE)
    category = models.CharField(max_length=100, choices=CATEGORY)
    video = EmbedVideoField(verbose_name='Videos',
                        help_text='URL of Video')

    def __str__(self):
        return self.title

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

那么,我的观点是:

    def home(request):
        amlvideo = AMLVideo.objects.filter().order_by("-category", "-language", "-level")
        context = {"amlvideo": amlvideo}
        return render(request, "aml/home.html", context)

基本上我想做的是在按钮上有默认的类别,另一个用户可以从他的个人资料中添加一个类别。这些类别然后显示在前端,当用户选择一个类别时,带有这些类别的视频将从前端“固定”下来。你知道吗

例如这个站点:https://www.planetread.org/anibooks

有人能帮我吗?你知道吗


Tags: nameverbosemodels类别level按钮languagelength
1条回答
网友
1楼 · 发布于 2024-04-20 11:30:01

在这种情况下,可以使用Django Form在客户端创建下拉列表。您可以使用表单保存筛选数据,然后在创建表单时,可以将用户配置文件中的类别、语言和级别添加到表单中,并将其放入视图上下文中。像这样:

过滤形式:

from django import forms


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

    LEVELS = [
        ('', 'All'),
        ('BEG', 'Beginner'),
        ('INT', 'Intermediary'),
        ('ADV', 'Advanced'),
    ]

    CATEGORIES = [
        ('', 'All'),
        ('ANI', 'Animal'),
        ('ENV', 'Environmental'),
        ('MOR', 'Moral'),
        ('FOLK', 'Folktales'),
        ('ADN', 'Adventure'),
        ('POE', 'Poems'),
        ('FUN', 'Funny'),
    ]

    language = forms.ChoiceField(required=False)
    level = forms.ChoiceField(required=False)
    category = forms.ChoiceField(required=False)

    def __init__(profile, *args, **kwargs):
        # Combine default choices and choices from user profile on form create
        self.fields['category'].choices = self.CATEGORIES + [(category.id, category.name) for category in profile.categories]
        self.fields['language'].choices = self.LANGUAGES + [(language.id, language.name) for language in profile.languages]
        self.fields['level'].choices = self.LEVELS + [(level.id, level.name) for level in profile.levels]

您的模型如下:

class AMLVideo(models.Model):
    title = models.CharField(max_length=100, default=None)
    level = models.CharField(max_length=100)
    language = models.CharField(max_length=100)
    category = models.CharField(max_length=100)
    video = EmbedVideoField(verbose_name='Videos',
                        help_text='URL of Video')

    def __str__(self):
        return self.title

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

那么在你看来:

from .forms import AMLVideoFilterForm
from .models import AMLVideo


def home_view(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")

    # Create new filter and keep the current filter
    filter_form = AMLVideoFilterForm(profile=request.user.profile, initial={
        "category": category, "language": language, "level": level
    })
    context = {
        "videos": videos,
        "filter_form": filter_form
    }
    return render(request, 'aml/home.html', context=context)

aml/home.html中,可以使用如下形式:

<form>
    <ul>
        <li> Category: {{ filter_form.category }}</li>
        <li> Category: {{ filter_form.language }}</li>
        <li> Category: {{ filter_form.level }}</li>
    </ul>
    <input type="submit" value="Filter">
</form>
{% for video in videos %}
    <p>Filtered videos here!</p>
{% endfor %}

您可以删除提交输入并在选择更改时触发它。你知道吗

希望有帮助!你知道吗

相关问题 更多 >