Python 多回波场Django滤波器

Python 多回波场Django滤波器,python,django,Python,Django,我有模特技巧 class Skill(models.Model): hero= models.ForeignKey(Hero) name = models.CharField(max_length=255) 我有一个模范英雄 class Hero(models.Model): name = models.CharField(max_length=255) 我使用多选字段选择技能 OPTIONS = ( ("sharingan", "sharingan")

我有模特技巧

class Skill(models.Model):
    hero= models.ForeignKey(Hero)
    name = models.CharField(max_length=255)
我有一个模范英雄

class Hero(models.Model):
   name = models.CharField(max_length=255)
我使用多选字段选择技能

OPTIONS = (
        ("sharingan", "sharingan"),
        ("rasengan", "rasengan"),
        ("fireball", "fireball"),
    )

    skills= forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(),
                                          choices=OPTIONS)
我使用
get request
发送我的表单,我的搜索页面url类似于:

mysite.com/search?skills=shiringan&skills=rasengan
在我看来,我有

def vip(request):
    heroes = Hero.objects.all
    return render(request, 'app_name/search.html',{'heroes': heroes})

我应该在
views.py
中写些什么来选择所有拥有所选技能的英雄?

您可能想改用
ManyToManyField

像这样:

# models.py
from django.db import models

class Skill(models.Model):
    name = models.CharField(max_length=255)

class Hero(models.Model):
    name = models.CharField(max_length=255)
    skills = models.ManyToManyField(Skill)
# forms.py
from django import forms
from .models import Hero

class HeroForm(forms.ModelForm):
    class Meta:
        model = Hero
        fields = '__all__'
并使用如下形式:

# models.py
from django.db import models

class Skill(models.Model):
    name = models.CharField(max_length=255)

class Hero(models.Model):
    name = models.CharField(max_length=255)
    skills = models.ManyToManyField(Skill)
# forms.py
from django import forms
from .models import Hero

class HeroForm(forms.ModelForm):
    class Meta:
        model = Hero
        fields = '__all__'
最后,你的观点是:

# views.py
from .models import Hero, Skill
from .forms import HeroForm

def my_heroes(request):
    heroes = Hero.objects.all()
    return render(request, 'your_template.html', {'heroes':heroes})

def hero_skill_select(request):
    if request.method == 'POST':
        form = HeroForm(request.POST)
        # do something
    else:
        form = HeroForm()
    return render(request, 'template_with_form.html', {'form':form})

您可能想改用
ManyToManyField

像这样:

# models.py
from django.db import models

class Skill(models.Model):
    name = models.CharField(max_length=255)

class Hero(models.Model):
    name = models.CharField(max_length=255)
    skills = models.ManyToManyField(Skill)
# forms.py
from django import forms
from .models import Hero

class HeroForm(forms.ModelForm):
    class Meta:
        model = Hero
        fields = '__all__'
并使用如下形式:

# models.py
from django.db import models

class Skill(models.Model):
    name = models.CharField(max_length=255)

class Hero(models.Model):
    name = models.CharField(max_length=255)
    skills = models.ManyToManyField(Skill)
# forms.py
from django import forms
from .models import Hero

class HeroForm(forms.ModelForm):
    class Meta:
        model = Hero
        fields = '__all__'
最后,你的观点是:

# views.py
from .models import Hero, Skill
from .forms import HeroForm

def my_heroes(request):
    heroes = Hero.objects.all()
    return render(request, 'your_template.html', {'heroes':heroes})

def hero_skill_select(request):
    if request.method == 'POST':
        form = HeroForm(request.POST)
        # do something
    else:
        form = HeroForm()
    return render(request, 'template_with_form.html', {'form':form})

英雄模式难道不应该具备外域技能,而不是相反的技能吗?我不明白你上课背后的逻辑

根据您当前的类及其关系,您可以执行以下操作:

chosen_skills = Skill.objects.values('hero').distinct().annotate(skill='name', hero_name='hero__name')

没有测试过,但基本上,对于每个不同的英雄,它都会返回技能和名称。让我知道这是否有帮助。

英雄模特不应该拥有外域技能,而不是相反的技能吗?我不明白你上课背后的逻辑

根据您当前的类及其关系,您可以执行以下操作:

chosen_skills = Skill.objects.values('hero').distinct().annotate(skill='name', hero_name='hero__name')

没有测试过,但基本上,对于每个不同的英雄,它都会返回技能和名称。如果有帮助,请告诉我。

为什么不使用ManyToManyField?为什么不使用ManyToManyField?我有一个问题:现在我使用的是自定义表单,而不是模型表单。对于这项任务来说,它只是更好。我构建了这样一个表单:
age=forms.ChoiceField(label=“”,choices=age,required=False)
在我的
search.html
中,我像这样包含它:
{{simple\u search\u form.age}
我能用技能做同样的事情吗?我可以写一些像
{{simple\u search\u form.skills}}
这样的东西吗?我有一个问题:现在我使用的是自定义表单,而不是模型表单。对于这项任务来说,它只是更好。我构建了这样一个表单:
age=forms.ChoiceField(label=“”,choices=age,required=False)
在我的
search.html
中,我像这样包含它:
{{simple\u search\u form.age}
我能用技能做同样的事情吗?我可以写一些像
{{simple\u search\u form.skills}}
这样的东西吗?