2013-04-18 54 views
1

我需要一个更好的解决方案,以尝试在下面达成目标。我有一个形式,这种形式需要决定了代码以下项目的顺序...Django在课堂上的订购代码

class ContactCSVModel(CsvModel): 
    first_name = CharField() 
    last_name = CharField() 
    company = CharField() 
    mobile = CharField() 
    group = DjangoModelField(Group) 
    contact_owner = DjangoModelField(User) 

例如...

class ContactCSVModel(CsvModel): 
    if form.col1.value == "first_name": 
     first_name = CharField() 
    elif form.col1.value == "last_name": 
     last_name = CharField() 

也许

class ContactCSVModel(CsvModel): 
     [column.col1.value] = CharField() 
     [column.col2.value] = CharField() 

但这不会工作,因为它会尝试分配值不mak e it first_name = CharField()等

正如你所看到的,我最终再次为col2,col3等做了这样的事情,并以'if语句'的'lot'结束。

有没有更好的方法,例如?

谢谢。

Forms.py

COL_CHOICES = [ 
    ('NONE', 'No Import'), 
    ('first_name', 'First Name'), 
    ('last_name', 'Last Name'), 
    ('company', 'Company'), 
    ('mobile', 'Mobile Number'), 
    ('email', 'Email Address'), 
    ] 


class ConfiguratorForm(forms.Form): 
    col1 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 
    col2 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 
    col3 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 
    col4 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 
    col5 = forms.TypedChoiceField(choices=COL_CHOICES, initial='first_name') 

这是我不变类,因为它现在是:

def import_data(column, *args, **kw): 
    # make custom ContactCSVModel 
    class ContactCSVModel(CsvModel): 
     # IF column == x 



     first_name = CharField() 
     mobile = CharField() 
     last_name = CharField() 
     company = CharField() 
     group = DjangoModelField(Group) 
     contact_owner = DjangoModelField(User) 

     class Meta: 
      delimiter = "," 
      dbModel = Contact 
      update = {'keys': ["mobile", "group"]} 

    return ContactCSVModel.import_data(*args, **kw) 
+0

你可以添加更多关于你想要实现的细节吗?我不知道更改订单代码会为您出现什么。另外,查看了[Django模型字段参考](https://docs.djangoproject.com/en/1.5/ref/models/fields/),我找不到任何类似DjangoModelField的东西。 –

+0

我想要做这样的事情column.col1.value = CharField(),但这只是分配值,我想它打印它的值first_name = CharField()这是col1的值 – Prometheus

+0

你的意思是你试图让你的程序在运行时重写自己? –

回答

3

你可以添加字段到模型之后,如:

class ContactCSVModel(CsvModel): 
    pass 

for form_field in form: 
    field_name = form_field.value 
    model_field = CharField() 
    model_field.contribute_to_class(ContactCSVModel, field_name) 

例如(使用Django 1.5):

from django.db import models 

class ContactCSVModel(models.Model): 
    pass 

for field_name in ('first_name', 'mobile', 'last_name'): 
    model_field = models.CharField() 
    model_field.contribute_to_class(ContactCSVModel, field_name) 

print [f.name for f in ContactCSVModel._meta.fields] 

# prints: 
[u'id', 'first_name', 'mobile', 'last_name'] 
+0

这样做的顺序是什么?它必须按照col1,col2,col3的顺序排列。 – Prometheus

+0

'for form_field in form'将按顺序遍历表单的字段(即col1,col2,col3),所以字段将以正确的顺序添加到模型中。 –

+0

setattr?这会不会更好? contribution_to_class似乎不适用于我 – Prometheus