型号
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方法,以便根据某些条件返回一个特定的model属性。
我应该提到的是,这里我使用的是django选择的表单,其行为与Django模型表单非常相似,只是具有一些附加功能。
我通过以下代码得到的特定错误消息是:
__init__() takes exactly 1 argument (2 given)
我不确定您的ChosenModelChoiceField
,我假设它是的子类ModelChoiceField
,您应该label_from_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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句