Python 在Django Selected表单的模型选择字段中列出各种模型属性

Python 在Django Selected表单的模型选择字段中列出各种模型属性,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,Models.py from django.db import models class Sample(models.Model): sample_ID = models.CharField(max_length=20) sample_name = models.CharField(max_length=30) def __unicode__(self): return self.sample_ID class Meta:

Models.py

from django.db import models

class Sample(models.Model):
    sample_ID = models.CharField(max_length=20)
    sample_name = models.CharField(max_length=30)


    def __unicode__(self):
        return self.sample_ID

    class Meta:
        ordering = ['id']
Forms.py

from django import forms
from chosen import forms as chosenforms
from .models import Sample

class SampleLookupForm(forms.Form):
    Sample_ID = chosenforms.ChosenModelChoiceField(queryset=Sample.objects.all())

class SampleNameLookupForm(forms.Form):
    def __init__(self):
        samples = Sample.objects.all().values_list('sample_name', flat=True)
        sample_tuple = [(i, i) for i in samples]
        self.fields['Sample_Name'] = chosenforms.ChosenChoiceField(sample_tuple)
这里我有两个表单,其中一个我想在下拉菜单中显示所有示例ID。另一个我想展示所有的样本名称

对于示例ID,这很容易,因为我定义了unicode方法来返回示例ID。但是,我不知道如何调整模型、表单或视图以创建包含示例名称的下拉菜单(即,unicode方法中返回的模型属性除外)

如何允许模型选择字段显示unicode方法中定义的模型属性以外的模型属性

或者,我应该定义unicode方法,使其根据特定条件返回特定的模型属性

我应该提到的是,这里我使用的是与Django模型表单行为非常相似的,只是添加了一些功能

我从以下代码中得到的具体错误消息是:

__init__() takes exactly 1 argument (2 given)

我不确定您的
ChosenModelChoiceField
,我假设它是
ModelChoiceField
的子类,您应该在字段上覆盖
label\u from\u instance
方法:

class BlahChoiceField(chosenforms.ChosenModelChoiceField):
    def label_from_instance(self, obj):
        # return whatever text you want
        return obj.sample_name
那么对于定义,您需要:

sample_id = BlahChoiceField(queryset=Sample.objects.all())

编辑

您的原始代码在正确的路径上,但您的代码在这一行上是错误的:

self.fields['Sample_Name'] = chosenforms.ChosenChoiceField(sample_tuple)
应该是:

self.fields['Sample_Name'] = chosenforms.ChosenChoiceField(choices=sample_tuple)

你可以这样做

在模型“示例”中定义一些方法:

@staticmethod
def name_choices():
    return [s.name_choice() for s in Sample.objects.all()]

def name_choice(self):
    return self.sample_name, self.sample_name
然后你的表格是:

class SampleNameLookupForm(forms.Form):
    sample_name =  chosenforms.ChosenChoiceField(choices=Sample.name_choices())

只是一个建议,你们的类字段最好都是小写的,下划线分隔的名称。好的,这是惯例。