2010-12-10 18 views
2

マイmodels.py:追加の引数やフォームインスタンスをdjango formsetに渡すことはできますか?

--company--、--time period--

  • データ要素1:

    class Company(models.Model): 
        company_name = models.CharField(max_length=255) 
    
    class TimePeriod(models.Model): 
        period = models.CharField(max_length=4) 
    
    class Unit(models.Model): 
        unit_name = models.CharField(max_length=50) 
        unit_type = models.CharField(max_length=50) 
    
    class DataElement(models.Model): 
        data_element_name = models.CharField(max_length=50) 
    
    class Source(models.Model): 
        source_name = models.CharField(max_length=50)  
    
    class CompanyData(models.Model): 
        company = models.ForeignKey(Company) 
        time_period = models.ForeignKey(TimePeriod) 
        data_element = models.ForeignKey(DataElement) 
        unit = models.ForeignKey(Unit) 
        source = models.ForeignKey(Source) 
        value = models.DecimalField(max_digits=15, decimal_places=2) 
    

    私はと同様の形式を持っているしたいのですが - --unit--、-value--、--source--

  • データ要素2:--value--、--unit--、--source--
  • ...
  • データelementN:今--value--、--unit--、--source--

マイforms.py:

class CompanyTimeForm(ModelForm): 
    class Meta: 
     model = CompanyData 
     fields = ('company', 'time_period') 

class CompanyDataForm(ModelForm): 
# data_element = forms.IntegerField(widget=forms.HiddenInput()) 
# def __init__(self, extra): 
#  ... init data_element ... 
    class Meta: 
     model = CompanyData 
     fields = ('value', 'unit', 'source') 

と使用方法:

top_form = CompanyChainTimeForm(request.POST or None) 
CompanyDataFormSet = formset_factory(CompanyDataForm, extra=X) 
formset = CompanyDataFormSet() 

空のフォームセットを初期化してから、DataElement.objects.all()を取得して のformset.add(CompanyDataForm(... DataElement.pk ...))と同様のものを作成できますか

または私の場合には何が最良の選択肢でしょうか?

答えて

0

time_periodがCompanyのフィールドであった場合、それはまっすぐ進むはずです。

フォームの外観では、フォームの外観では、そうでないにもかかわらず、そのように表示する必要があります。

最善のことは、そのための多くのフォームを生成するようにsaveformset_factoryFormを使用し、ModelFormを捨てることであろう。自分でsaveの中で、TimePeriodのインスタンスを作成し、実際に保存する前にCompanyに関連付けることができます。

+0

問題はむしろCompamyData.data_element時間期間ではありません。私はすべての新しいレコード(CompanyTimeForm)と多くの(N = DataElementsレコードの数)同様のフォームに共通のフィールドを持ち、N CompanyDataレコードとして保存されます(それぞれはCompanyTimeFormから同じフィールドを持ちます)。しかし、このようなフォームのそれぞれは、CompanyDataForm(コメント付き文字列)に渡すことができる一意の非表示のdataelement.pkを持つ必要がありますが、実際には(少なくともどのようにわからないのですか)実際にはできません。 – Alexey

0

ここでformsetを使用することは不可能です。 私は接頭辞で設定フォーム経由でそれをやった:

... 
data_forms = [] 
is_valid = True 
for de in DataElement.objects.all(): 
    data_form = CompanyDataForm(request.POST or None, initial={'data_element': de.pk}, value_label=de, prefix="de-%s" % de.pk) 
    if request.method == 'POST': 
     if not data_form.is_valid(): 
      is_valid = False 
    data_forms.append(data_form) 
関連する問題