3

私は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」フィールドのみを含むフォームを表示できるようにしたいと考えています。

これを行う 1 つの方法は、さまざまなフィールド スニペットごとに 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 を出力するたびに、探しているフォーム フィールドが正確に含まれていることがわかります。

考え?また、それを行うためのより良い方法をお勧めします。

4

1 に答える 1

4
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') )
于 2010-07-18T22:33:12.110 に答える