我有一个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))
问题是它只显示现有关系实例的表单。我如何获得所有专辑的条目。
谢谢。