2016-05-30 56 views
0

我想在另一个表格中显示表格。在另一个表格中显示表格

例如,我有这些模型:

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) 

,然后我有这些形式与之前的机型:

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 

表单中的ForeignKey的呈现为一个组合框包括所有在另一个表中的对象(在我的情况下,统计表),我想用StatsForm的对象替换组合框,所以我可以控制我呈现统计对象的方式

非常感谢。

+0

这不是很清楚你在问什么,但它听起来像你正在寻找[formsets](https://docs.djangoproject.com/en/dev/topics/forms/formsets/) – solarissmoke

+0

The ForeignKey in the窗体呈现为一个组合框包括在另一个表中的所有对象(在我的情况下,统计表),我想用统计窗体的对象替换组合框,所以我可以控制我呈现统计对象的方式 –

回答

2

您的数据库方案和模型的设计不正确,以解决手头的问题。你在错误的方向上定义了“有很多”的关系。一个Measurement应该有几个Statistics,但是一个Statistics不应该有很多Measurement

由于您的模型现在正在建立,ForeignKey在关系的错误一面。你应该这样做,而不是:

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) 

一旦你解决:

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 

要访问Statistics S代表一个Measurement在当前的代码,你可以添加@property快捷键一对夫妇提供相同的舒适性物体之间的关系问题变得更容易解决。而不是在形式ForeignKeyFieldsStatistics成为适当的相关对象,这是由Django常规处理。

由于@solarisssmoke在评论中提到您正在寻找formset。下面是从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以提升性能。