我一直试图弄清楚如何在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
有人可以帮助我吗?
答案 0 :(得分:3)
在这种情况下,您可以使用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 %}
您可以删除提交输入并在选择更改时触发它。
希望有帮助!