<p>一个<code>Car</code>可以有多个<code>color</code>s吗?在这种情况下<code>color</code>应该是<a href="http://docs.djangoproject.com/en/dev/ref/models/fields/#manytomanyfield" rel="noreferrer">many to many relationship</a>,而不是<code>CharField</code>。另一方面,如果您想做类似<a href="http://www.zzee.com/solutions/unix-permissions.shtml#numeric" rel="noreferrer">Unix permissions</a>(即红色+蓝色、红色+蓝色+绿色等)的事情,则将的数值赋给每个值,并使<code>color</code>成为<a href="http://docs.djangoproject.com/en/dev/ref/models/fields/#positivesmallintegerfield" rel="noreferrer">integer field</a>。</p>
<p><strong>更新</strong></p>
<p>(阅读注释后)您可以使用<a href="http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form" rel="noreferrer">custom form</a>在管理中编辑模型,而不是使用默认的<code>ModelForm</code>。此自定义表单可以使用允许用户选择多种颜色的多选小部件。然后,可以重写表单的<code>clean()</code>方法以返回适当的连接值(“RB”等)。</p>
<p><strong>更新2</strong></p>
<p>下面是一些代码:</p>
<p>首先,从模型字段中删除选项。同时将其最大大小增加到2。我们不想在这里选择-如果我们这样做,那么我们将不得不为每种颜色的组合添加一个选项。</p>
<pre><code>class Car(models.Model):
...
color= models.CharField(max_length=2)
</code></pre>
<p>其次,添加一个自定义的<code>ModelForm</code>以在管理应用程序中使用。此表单将重写颜色,并将其声明为多选字段。我们这里需要选择。</p>
<pre><code>COLORS= (
('R', 'Red'),
('B', 'Yellow'),
('G', 'White'),
)
class CarAdminForm(ModelForm):
color = forms.MultipleChoiceField(choices = COLORS)
class Meta:
model = Car
def clean_color(self):
color = self.cleaned_data['color']
if not color:
raise forms.ValidationError("...")
if len(color) > 2:
raise forms.ValidationError("...")
color = ''.join(color)
return color
</code></pre>
<p>注意,我只添加了几个验证。您可能需要更多和/或自定义验证。</p>
<p>最后,向管理员注册此表单。在你的<code>admin.py</code>里面:</p>
<pre><code>class CarAdmin(admin.ModelAdmin):
form = CarAdminForm
admin.site.register(Car, CarAdmin)
</code></pre>