python – Django Admin – 显示M2M模型的中介字段
我们有一个Django应用程序,其中包含一份报纸文章列表.每篇文章都与“发言人”以及“公司”(文章中提到的公司)有m2m关系.
目前,用于创建新文章的添加文章页面非常接近我们想要的 – 它只是股票Django Admin,我们使用filter_horizo??ntal来设置两个m2m关系. 下一步是在每个m2m关系上添加“评级”字段作为中间字段. 所以,我们的models.py的一个例子 class Article(models.Model): title = models.CharField(max_length=100) publication_date = models.DateField() entry_date = models.DateField(auto_now_add=True) abstract = models.TextField() # Can we restrict this to 450 characters? category = models.ForeignKey(Category) subject = models.ForeignKey(Subject) weekly_summary = models.BooleanField(help_text = 'Should this article be included in the weekly summary?') source_publication = models.ForeignKey(Publication) page_number = models.CharField(max_length=30) article_softcopy = models.FileField(upload_to='article_scans',null=True,blank=True,help_text='Optionally upload a soft-copy (scan) of the article.') url = models.URLField(null=True,help_text = 'Enter a URL for the article. Include the protocl (e.g. http)') firm = models.ManyToManyField(Firm,through='FirmRating') spokesperson = models.ManyToManyField(Spokeperson,through='SpokespersonRating') def __unicode__(self): return self.title class Firm(models.Model): name = models.CharField(max_length=50,unique=True) homepage = models.URLField(verify_exists=False,help_text='Enter the homepage of the firm. Include the protocol (e.g. http)') def __unicode__(self): return self.name class Meta: ordering = ['name'] class Spokeperson(models.Model): title = models.CharField(max_length=100) first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) def __unicode__(self): return self.first_name + ' ' + self.last_name class Meta: ordering = ['last_name','first_name'] class FirmRating(models.Model): firm = models.ForeignKey(Firm) article = models.ForeignKey(Article) rating = models.IntegerField() class SpokespersonRating(models.Model): firm = models.ForeignKey(Spokesperson) article = models.ForeignKey(Article) rating = models.IntegerField() 这里的问题是,一旦我们将我们的公司和发言人字段更改为“通过”并使用中介,我们的添加文章页面就不再具有filter_horizo??ntal控件来向文章添加Firms / Spokeperson关系 – 它们完全消失.你根本看不到它们.我不知道为什么会这样. 我希望有一些方法继续使用酷filter_horizo??ntal小部件来设置关系,并以某种方式只是嵌入下面的另一个字段来设置评级.但是,我不知道如何做到这一点,同时仍然利用Django管理员. 我在这里看到一篇关于覆盖Django管理员中的单个小部件的文章: http://www.fictitiousnonsense.com/archives/22 但是,我不确定该方法是否仍然有效,而且我不确定是否将它应用于此处,将FK应用于中间模型(它基本上是内联的?). 当然有一种简单的方法可以做到这一切吗? 干杯, 解决方法
问题是django.contrib.admin.options中的admin方法formfield_for_manytomany没有返回带有中间模型的多个字段的表单字段!
http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L157
您必须在ModelAdmin中覆盖此方法: def formfield_for_manytomany(self,db_field,request=None,**kwargs): """ Get a form Field for a ManyToManyField. """ # If it uses an intermediary model that isn't auto created,don't show # a field in admin. if not db_field.rel.through._meta.auto_created: return None # return something suitable for your needs here! db = kwargs.get('using') if db_field.name in self.raw_id_fields: kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel,using=db) kwargs['help_text'] = '' elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)): kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name,(db_field.name in self.filter_vertical)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |