我有一個ManyToMany字段與關係模型。我想要一個formset,按照其中一個 鍵進行篩選,該鍵爲每個其他鍵顯示一個表單。需要Formset與關係模型與一個ForeignKey的所有實例的形式
我的猜測是關係模型上的自定義管理器是解決此問題的關鍵。當數據庫中沒有真實實例時,管理器將返回使用適當的ForeignKey初始化的「幻影」實例。我只是不知道如何讓經理添加「幻影」實例,看起來是爲了過濾現有的實例。
我希望一個例子是值得1K字。
說我希望我的用戶能夠評價相冊。我想用 表示所選樂隊所有專輯的表格。示例模型&視圖
from django.contrib.auth.models import User
from django.db import models
class Band(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return self.name
class Album(models.Model):
name = models.CharField(max_length=30)
band = models.ForeignKey(Band)
ratings = models.ManyToManyField(User, through="Rating")
def __unicode__(self):
return self.name
class Rating(models.Model):
user = models.ForeignKey(User)
album = models.ForeignKey(Album)
rating = models.IntegerField()
def __unicode__(self):
return "%s: %s" % (self.user, self.album)
# views.py
from django.forms.models import modelformset_factory
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template.context import RequestContext
from models import Band, Rating
RatingFormSet = modelformset_factory(Rating, exclude=('user',), extra=1)
def update(request):
user = request.user
band = Band.objects.all()[0]
formset = RatingFormSet(request.POST or None,
queryset=Rating.objects.filter(album__band=band,
user=user))
if formset.is_valid():
objects = formset.save(commit=False)
print "saving %d objects" % len(objects)
for obj in objects:
obj.user = user
obj.save()
return HttpResponseRedirect("/update/")
return render_to_response("rating/update.html",
{'formset': formset, 'band':band},
context_instance=RequestContext(request))
問題是它只顯示現有關係實例的表單。我如何獲得所有專輯的條目。
謝謝。