2013-04-18 2 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() 

, но это не будет работать, поскольку оно попытается присвоить значение не мак e it first_name = CharField() и т. д.

Как вы можете видеть, я снова делаю это снова для col2, col3 и т. д. и заканчивая «лот» из «if statements».

Есть ли лучший способ, например?

Спасибо.

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? не будет ли это лучше? contrib_to_class, похоже, не работает для меня. – Prometheus

Смежные вопросы