2016-05-30 10 views
0

別のフォームにフォームを表示したい。例えば別のフォームにフォームを表示

Iは、これらのモデルを有する:

class Measure(models.Model): 

    length = models.ForeignKey(Statistics, related_name='Length', null=True, blank=True) 
    surface_area = models.ForeignKey(Statistics, related_name='Surface area+', null=True, blank=True) 
    section_area = models.ForeignKey(Statistics, related_name='Section area+', null=True, blank=True) 
    volume = models.ForeignKey(Statistics, related_name='Volume', null=True, blank=True) 
    diameter = models.ForeignKey(Statistics, related_name='Diameter', null=True, blank=True) 


class Statistics(models.Model): 
    total = models.FloatField('Total', null=True, blank=True) 
    avg = models.FloatField('Average', null=True, blank=True) 
    min = models.FloatField('Minimum', null=True, blank=True) 
    max = models.FloatField('Maximum', null=True, blank=True) 
    standard_deviation = models.FloatField('Standard deviation', null=True, blank=True) 

を、その後、私は以前のモデルに対応するこれらのフォームを有する:コンボボックスがすべて含まれるような形でのForeignKeyがレンダリングされる

class StatisticsForm(forms.ModelForm): 
    class Meta: 
     model = Statistics 
     fields = '__all__' 

class MeasureForm(forms.ModelForm): 
    class Meta: 
     model = Measure 
     fields = '__all__' 

     # Here I have to say that the right form for each field is the StatisticForm 

を他のテーブルのオブジェクト(私の場合はStatisticsテーブル)のコンボボックスをStatisticsFormのオブジェクトに置き換えて統計オブジェクトをレンダリングする方法を制御できます。

ありがとうございました。

+0

あなたが求めていることはあまり明確ではありませんが、[formsets](https://docs.djangoproject.com/en/dev/topics/forms/formsets/)を探しているようですね – solarissmoke

+0

The ForeignKey in theフォームは、他のテーブル(私の場合はStatisticsテーブル)のすべてのオブジェクトを含むコンボボックスとしてレンダリングされるので、コンボボックスをStatisticsFormのオブジェクトに置き換えて、Statisticsオブジェクトをレンダリングする方法を制御できます –

答えて

2

データベースのスキームとモデルが間違って問題を解決するために設計されています。間違った方向に「たくさんある」関係を定義しています。 1つのMeasurementには複数のStatisticsが含まれていますが、1つのStatisticsにはMeasurementが1つ多く含まれているとは限りません。

あなたのモデルが現在設定されているので、ForeignKeyは関係の間違った側にあります。あなたは代わりにこれを行う必要があります。

class Measure(models.Model): 
    def save(self,*args,**kwargs): 
     result = super(Measure, self).save(*args,**kwargs) 
     Statistics.objects.create(name='length', measurement=self) 
     Statistics.objects.create(name='section', measurement=self) 
     Statistics.objects.create(name='surface', measurement=self) 
     Statistics.objects.create(name='volume', measurement=self) 
     Statistics.objects.create(name='diameter', measurement=self) 
     return result 

をあなたは@propertyショートカットのカップルを追加することができ、あなたの現在のコードのように1 MeasurementためStatistics Sにアクセスするのと同じ快適さを提供するために:

class Measure(models.Model): 
    @property 
    def length(self): 
     return self.statistics_set.get(name='length') 
    @property 
    def section(self): 
     return self.statistics_set.get(name='section') 
    @property 
    def surface(self): 
     return self.statistics_set.get(name='surface') 
    @property 
    def volume(self): 
     return self.statistics_set.get(name='volume') 
    @property 
    def diameter(self): 
     return self.statistics_set.get(name='diameter') 

class Statistics(models.Model): 
    name = models.CharField(max_length=10) 
    measurement = models.ForeignKey('Measurement') 
    total = models.FloatField('Total', null=True, blank=True) 
    avg = models.FloatField('Average', null=True, blank=True) 
    min = models.FloatField('Minimum', null=True, blank=True) 
    max = models.FloatField('Maximum', null=True, blank=True) 
    standard_deviation = models.FloatField('Standard deviation', null=True, blank=True) 

あなたが解決したら、オブジェクト間の関係は、問題を解決することがはるかに容易になります。 ForeignKeyFieldsの形式ではなく、Statisticsが適切な関連オブジェクトになり、これは日常的にdjangoによって処理されます。

@solarisssmokeはあなたが書式セットを探しているコメントに記載されています。ここでは、必要なものを達成するための方法を示すdjango documentationからの例です:

問題のモデル:

class Author(models.Model): 
    name = models.CharField(max_length=100) 
    title = models.CharField(max_length=3, choices=TITLE_CHOICES) 
    birth_date = models.DateField(blank=True, null=True) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Book(models.Model): 
    name = models.CharField(max_length=100) 
    authors = models.ManyToManyField(Author) 

し、必要なフォームセットを作成するためにinlineformset_factoryを使用してビュー:

from django.forms import inlineformset_factory 


def manage_books(request, author_id): 
    author = Author.objects.get(pk=author_id) 
    BookInlineFormSet = inlineformset_factory(Author, Book, fields=('title',)) 
    if request.method == "POST": 
     formset = BookInlineFormSet(request.POST, request.FILES, instance=author) 
     if formset.is_valid(): 
      formset.save() 
      # Do something. Should generally end with a redirect. For example: 
      return HttpResponseRedirect(author.get_absolute_url()) 
    else: 
     formset = BookInlineFormSet(instance=author) 
    return render(request, 'manage_books.html', {'formset': formset}) 

の場合パフォーマンスが問題になる場合は、パフォーマンスを向上させるためにprefetch_relatedを参照してください。

関連する問題