新聞記事のリストを含む Django アプリがあります。各記事には、「スポークスパーソン」と「会社」(記事で言及されている会社) の両方との m2m 関係があります。
現時点では、新しい記事を作成するための [記事の追加] ページは、私たちが望むものに非常に近いものです。これは単なる Django Admin であり、2 つの m2m 関係を設定するために filter_horizontal を使用しています。
次のステップは、各 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, blank=True, help_text = 'Enter a URL for the article. Include the protocl (e.g. http)')
firm = models.ManyToManyField(Firm, null=True, blank=True, through='FirmRating')
spokesperson = models.ManyToManyField(Spokeperson, null=True, blank=True, 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_horizontal コントロールがなくなり、完全に消えてしまうことです。まったく見えません。これがなぜなのかわかりません。
クールな filter_horizontal ウィジェットを引き続き使用して関係を設定し、その下に別のフィールドを埋め込んで評価を設定する方法があることを期待していました。ただし、Django管理者を活用しながらこれを行う方法がわかりません。
Django admin で単一のウィジェットをオーバーライドすることについての記事をここで見ました。
http://www.fictitiousnonsense.com/archives/22
ただし、そのメソッドがまだ有効かどうかはわかりません。また、中間モデルへの FK を使用して、ここに適用するかどうかもわかりません (基本的にはインラインですか?)。
確かにこれをすべて行う簡単な方法はありますか?
乾杯、ビクター