2017-02-01 5 views
0

Ich versuche, das Versionsfeld andere aus dem unten Modell angezeigt werden als der Standard str die field2_name ist:Anzeigefeld anders als __str__

Hinweis: Diese SO Link Displaying a specific field in a django form könnte mehr sein, als ich brauche, aber ich bin nicht 100% sicher. Ich habe versucht, dies umzusetzen, war aber nicht erfolgreich.

Beachten Sie auch, dass ich das Beispiel bei https://docs.djangoproject.com/en/1.10/ref/forms/fields/ versucht, aber war nicht in der Lage, es zu bekommen

Modell (Generic-Namen) zu arbeiten:

class CodeVersion(models.Model): 
field1= models.ForeignKey(SomeOtherModel, on_delete=models.CASCADE) 
field2_name = models.CharField(max_length=256) 
field3_description = models.CharField(max_length=1000, blank=True) 
version = models.PositiveIntegerField() 

def __str__(self): 
    return self.field2_name 

Form:

class VersionsForm(forms.Form): 

code_versions = forms.ModelChoiceField(queryset=CodeVersion.objects.none()) 

def __init__(self, SomeOtherModel_id): 
    super(VersionsForm, self).__init__() 
    self.fields['infocode_versions'].queryset = CodeVersion.objects.filter(SomeOtherModel_id=SomeOtherModel_id) 

Dies funktioniert - es gibt field2_name zurück, wie es soll.

Wie kehre ich Version statt - was ist die einfachste Art und Weise?

Jede Hilfe oder Anleitung wird geschätzt.

Antwort

1

Wenn ich Ihre Frage richtig bekam könnten Sie Objekt String-Darstellung ändern

def __str__(self): 
    return str(self.version) 

Sie könnten dann ModelChoiceField erben und label_from_instance Methode

oder sogar Affen es so

self.fields['field_name'].label_from_instance = self.label_from_instance 

@staticmethod 
def label_from_instance(self): 
    return str(self.value) 
+0

Vielen Dank für die Beantwortung :) Leider kann ich nicht die str für dieses Modell ändern. – beginAgain

+0

Sie könnten dann ModelChoiceField erben und überschreiben label_from_instance Methode – iklinac

+0

Danke - ich werde weiter suchen heute in zu label_from_instance und Ihre Ideen. – beginAgain

3

Patch außer Kraft setzen Von der ModelChoiceField docs:

Die __str__ (__unicode__ auf Python 2) Methode des Modells wird aufgerufen Zeichenfolge Darstellungen der Objekte für den Einsatz im Bereich der Wahlmöglichkeiten zu erzeugen; um benutzerdefinierte Darstellungen bereitzustellen, Unterklasse ModelChoiceField und überschreiben label_from_instance. Diese Methode empfängt ein Modellobjekt und sollte eine Zeichenfolge zurückgeben, die für die Darstellung geeignet ist. Zum Beispiel:

from django.forms import ModelChoiceField 

class MyModelChoiceField(ModelChoiceField): 
    def label_from_instance(self, obj): 
     return "My Object #%i" % obj.id 
+0

Vielen Dank für Ihre Antwort. Ich habe versucht, eine Version davon (siehe 1. SO-Link) und ich konnte es nicht zum Laufen bringen. Es ist möglich, dass ich es falsch gemacht habe. Ich werde heute dieses spezielle Beispiel betrachten. Die Wahrheit ist, ich weiß nicht genau, was genau in diesem Beispiel passiert, aber ich werde "eingraben". :) – beginAgain

+0

Gab Ihnen +1 - siehe Kommentar Ich machte zu Iklinac. – beginAgain