Установить видимые поля Django ModelForm во время выполнения? - PullRequest
3 голосов
/ 18 июля 2010

У меня есть модель Django:

class Customer(models.Model):
  first_name=models.CharField(max_length=20,null=True, blank=True)
  last_name=models.CharField(max_length=25,null=True, blank=True)
  address=models.CharField(max_length=60,null=True, blank=True)
  address2=models.CharField(max_length=60,null=True, blank=True)
  city=models.CharField(max_length=40,null=True, blank=True)
  state=models.CharField(max_length=2,null=True, blank=True)

Оттуда я создал ModelForm:

class CustomerForm(forms.ModelForm):
  class Meta:
    model=Customer

Я хотел бы иметь возможность показывать части формы в моем шаблоне, соответствующие конкретной информации, которую пользователи могут изменить. Например, если я хочу, чтобы клиенты меняли свое имя, я хотел бы иметь возможность отображать форму, содержащую только поля 'first_name' и 'last_name'.

Один из способов сделать это - создать ModelForm для каждого из различных фрагментов полей ... для примера с именем это будет выглядеть примерно так:

class CustomerFormName(forms.ModelForm):
  class Meta:
    model=Customer
    fields=('first_name','last_name')

Это выглядит довольно не элегантно и негибко. Что я хотел бы сделать, так это уметь указывать поля во время выполнения, поэтому, когда я передаю словарь из представления в шаблон, я могу просто указать, какие поля я хотел бы показать. Как я могу настроить его так, чтобы я устанавливал поля для формы во время выполнения? В идеале я хотел бы, чтобы окончательный словарь передавался примерно так:

{'name_change_form':CustomerFormName(<form with only first_name and last_name>), 'address_change_form':CustomerFormName(<form with only address fields>)}

Тогда я знаю, что всякий раз, когда я вывожу name_change_form.as_p, у него будут именно те поля формы, которые я ищу.

Мысли? Также не стесняйтесь рекомендовать лучший способ сделать это.

1 Ответ

4 голосов
/ 19 июля 2010
from django.forms import ModelForm
from wherever import Customer
def formClassFactory(model,fields):
  ff = fields
  mm = model
  class formClass(ModelForm):
    class Meta:
      model  = mm
      fields = ff
  return formClass
form_class = formClassFactory( ('first_name','last_name') )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...