Frage

Wir haben eine Django-App, die eine Liste von Zeitungsartikeln enthält. Jeder Artikel hat eine m2m-Beziehung sowohl mit einem „Sprecher“, sowie eine „Firma“ (Gesellschaft in dem Artikel erwähnt).

Im Moment der Add Artikel Seite für neue Artikel zu schaffen ist ganz in der Nähe, was wir wollen -. Es ist nur das Lager Django Admin, und wir verwenden filter_horizontal für die beiden m2m Beziehungen Einstellung

Der nächste Schritt war eine „Bewertung“ Feld als Vermittler Feld auf jeder m2m Beziehung hinzuzufügen.

So wird ein Beispiel für unsere 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()

Das Problem hier ist, dass wenn wir unsere Firma und Sprecher Feld „durch“ und die Nutzung Vermittler zu ändern, unsere Artikel hinzufügen Seite nicht mehr filter_horizontal Kontrolle hat Firmen / spokeperson Beziehungen zu dem Artikel hinzufügen - sie vollständig verschwinden. Sie können sie überhaupt nicht sehen. Ich habe keine Ahnung, warum das so ist.

Ich hatte gehofft, für es eine Möglichkeit, um die kühl zu halten mit filter_horizontal Widget, um die Beziehung zu setzen, und irgendwie einbetten nur ein weiteres Feld unten, dass das Rating für die Einstellung. Aber ich bin nicht sicher, wie dies zu tun, während immer noch die Django Admin-Nutzung aus.

ich sah einen writeup hier über einen Widget in Django Admin überschreiben:

http://www.fictitiousnonsense.com/archives/22

Allerdings bin ich mich nicht sicher, ob das Verfahren nach wie vor gültig ist, und ich bin nicht sicher, es die Anwendung hier mit einem FK an ein Intermediär-Modell (es ist im Grunde ein Inline dann?).

Sicher gibt es eine einfache Möglichkeit, alle dies zu tun?

Cheers, Victor

War es hilfreich?

Lösung

Das Problem ist, dass die Methode formfield_for_manytomany Admin-in django.contrib.admin.options nicht ein Formularfeld für ManyToMany Felder mit einem Zwischenmodell zurückkehrt! http://code.djangoproject.com/browser /django/trunk/django/contrib/admin/options.py#L157

Sie können diese Methode in Ihrer Modeladmin haben außer Kraft zu setzen:

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))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top