2017-02-01 35 views
0

我試圖從不是缺省STR這是field2_name其他下面的模型顯示版本字段:比其他的顯示領域__str__

注:本SO鏈接Displaying a specific field in a django form可能會比我更需要,但我不是100%確定的。我試圖實現這一點,但沒有成功。

另外請注意,我試過的例子在https://docs.djangoproject.com/en/1.10/ref/forms/fields/但無法得到它的工作

模型(通用名):

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 

形式:

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) 

該作品 - 它應該返回field2_name。

我該如何返回版本 - 最簡單的方法是什麼?

任何幫助或指導表示讚賞。

回答

1

如果我正確地得到了你的問題,你可以改變對象的字符串表示

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

然後,您可以繼承ModelChoiceField和覆蓋label_from_instance方法

甚至猴子打補丁這樣

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

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

感謝您回覆:)不幸的是我無法改變的STR這種特殊的模式。 – beginAgain

+0

然後,您可以繼承ModelChoiceField並覆蓋label_from_instance方法 – iklinac

+0

謝謝 - 我今天將繼續討論label_from_instance和您的想法。 – beginAgain

3

來自ModelChoiceField docs

將調用該模型的__str____unicode__ on Python 2)方法來生成字段的選擇中使用的對象的字符串表示形式;提供定製的表示,子類ModelChoiceField和覆蓋label_from_instance。這個方法將接收一個模型對象,並且應該返回一個適合表示它的字符串。例如:

from django.forms import ModelChoiceField 

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

謝謝你的迴應。我嘗試了一個版本(請參閱第1個SO鏈接),我無法使其工作。這可能是我做錯了。我今天會看看這個具體的例子。事實是,我並不清楚這個例子中究竟發生了什麼,但我會「深入」。 :) – beginAgain

+0

給你+1 - 請參閱我對iklinac的評論。 – beginAgain