2016-09-26 46 views
1

我想创建一个ModelForm音乐家模型,从中必须可以为每个音乐家选择 大量专辑。由于专辑是逆向foreignkey,我认为 ModelForm不会将专辑值保存到在database.Is有任何可能的方法来得到这个工作Modelform with reverse foriegnkey

请帮助我,在此先感谢

这里是我的ModelForm:

class musicianForm(forms.ModelForm): 


    album=forms.ModelMultipleChoiceField(queryset=Musician.objects.all(), 
              widget=forms.widgets.CheckboxSelectMultiple()) 


    class Meta: 
     model = Musician 
     fields = ('album','first_name','last_name','instrument') 

models.py

from django.db import models 

class Musician(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    instrument = models.CharField(max_length=100) 

class Album(models.Model): 
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE) 
    name = models.CharField(max_length=100) 
    release_date = models.DateField() 
    num_stars = models.IntegerField() 

admin.py

class musicianAdmin(admin.ModelAdmin): 
    form = musicianForm 

回答

0

做到这一点,最好的办法是覆盖您的形式是这样的__init__

class MusicianForm(forms.ModelForm): 

    musician = forms.CharField() 

    def __init__(self, *args, **kwargs): 
     super(MusicianForm, self).__init__(*args, **kwargs) 
     self.fields['musician'] = forms.MultipleChoiceField(   
     widget=forms.CheckboxSelectMultiple, choices=(((choice.id), choice) for choice in Musician.objects.all())) 

class Meta: 
    model = Album 
    fields = ('name','release_date','num_stars') 

然后在你的models.py你必须创建另一种将艺术家与专辑连接起来的模式。如果你不这样做,你可以将一个艺术家只能添加到相册(可能有合作,所以我们必须做到这一点):

class Musician(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    instrument = models.CharField(max_length=100) 

    def __str__(self): 
     return self.first_name + " " + self.last_name 

class Album(models.Model): 
    name = models.CharField(max_length=100) 
    release_date = models.DateField() 
    num_stars = models.IntegerField() 

    def __str__(self): 
     return self.name 

class AlMu(models.Model): 
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE) 
    album = models.ForeignKey(Album, on_delete=models.CASCADE) 

然后来处理我们的数据和连接一切,做到这一点:

def create_album(request): 
    if request.method == "POST": 
     form = MusicianForm(request.POST) 
     if form.is_valid(): 
      mu = form.save(commit=False) 
      mu.name = form.cleaned_data['name'] 
      mu.release_date = form.cleaned_data['release_date'] 
      mu.num_stars = form.cleaned_data['num_stars'] 
      mu.save() 
      for i in form.cleaned_data['musician']: 
       mus = Musician.objects.get(id=i) 
       AlMu(artist=mus, album=mu).save() 
      # do something fancy here. Redirect or so 
    else: 
     form = MusicianForm() 

    return render(request, 'create_album.html', {'form': form}) 

create_album.html文件看起来像这样(没有什么幻想):

<form method="POST"> 
    {{form}} 
    <input type="Submit" value="Submit"> 
</form> 
+1

仍然没有运气,这张专辑似乎并不存储在database.album返回一个空list.i认为这需要覆盖保存方法 –

+0

是的。它也不适用于我... –

+0

@KiranS很抱歉的回复。我想我误解了你想做的事情。简而言之:您是否想要获得所有可用音乐人的复选框列表,然后选中一个(或两个)并将其添加到相册中?那是对的吗? – 1GDST