连接两个模型以创建下拉列表



我想知道如何连接 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)

现在对于下拉菜单,我不太确定如何使用模板上的模型或表单来显示它。

我希望如果用户从下拉列表中选择某些内容,则将显示的视频基于用户选择的下拉列表。

这可能吗?

你可以通过使用 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)

首页.html

<body>
...
<form method="GET">
{{ filter_form }}
</form>
{% for video in videos %}
<p>Render your video here</p>
{% endfor %}
...
</body>

然后,每当您更改过滤器选择时,它都会以GET方法提交表单。在视图中,您必须在表单数据中获取筛选器才能筛选数据。关于小部件,您必须添加onchange事件,以便每当用户更改下拉值时,它将提交表单以再次过滤数据。这是一种不使用 JavaScript 或 jQuery 的替代处理方式。

希望对您有所帮助!

最新更新