2017-04-04 40 views
0

Django的過濾器我有模型技能通過multipleChoiceField

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 

在我的views.py我有

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

,我應該寫views.py什麼選擇與選擇的技能所有的英雄?

+0

爲什麼不使用ManyToManyField? – Beomi

回答

0

你可能想用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__' 

,最後大家的意見:

# 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}) 
+0

我有一個問題:現在我使用自定義表單,而不是模型的表單。這對這個任務來說更好。我創建了一個這樣的表單:'age = forms.ChoiceField(label =「」,choices = age,required = False)'在我的'search.html'中,我包含它:'{{simple_search_form.age}} '我可以用技能來做同樣的事嗎?我可以寫一些類似「{{simple_search_form.skills}}」的東西嗎? – user2950593

0

不應在英雄模式有技能的foreignfield,而不是相反?我不明白你班上的邏輯。

根據您當前的類和他們的關係,你可以做這樣的事情:

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

沒有測試過,但基本上,對於每一個不同的英雄,它返回的技能和名稱。讓我知道這是否有幫助。