2014-09-16 5 views
0

Если у меня есть 3 стола: House> Parent> Child. Как распечатать данные в формате pdf о родителях, о том, в каком доме они живут, и о том, что у них есть у детей.django борется с основами reportlab

view.py

def some_view(request): 
    response = HttpResponse(content_type='application/pdf') 
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"' 

    p = canvas.Canvas(response) 

    p.drawString(100, 100, "Hello World.") 

    p.showPage() 
    p.save() 
    return response 

models.py

class House(request): 
    address = models.CharField() 

class Parent(request): 
    name = models.CharField() 
    house = models.ForeignKey(House, related_name='parents') 

class Child(request): 
    name = models.CharField() 
    parent = models.ForeignKey(Parent, related_name='children') 

Извините за такой обширный вопрос. Я просто не знаю, должны были начать и борется с Docs

+0

Работает ли ваш код? В чем проблема? – goncalopp

+0

Пример сверху только распечатывает «Hello world», как мне получить данные из моих моделей? –

+2

Это действительно слишком широко. Вы можете начать решать проблему в 3 этапа - сначала напишите запрос, который генерирует данные в требуемом формате. Во-вторых, начните работу с тем, как создавать pdf-файлы с помощью reportlab. Затем, объединение этих вещей - последний шаг. – karthikr

ответ

1

Вот предложение, как вы можете идти об этом, первый код, а затем какое-то объяснение:

HOUSE_X = ... 
PARENT_X = ... 
CHILD_X = ... 
START_Y = ... 
SEP_Y = ... 

y = START_Y; 
houses = House.objects.all() 
for house in houses: 
    p.drawString(HOUSE_X, y, house.address); 
    y += SEP_Y 
    parents = Parent.objects.filter(house=house) 
    for parent in parents: 
     p.drawString(PARENT_X, y, parent.name); 
     y += SEP_Y 
     children = Child.objects.filter(parent=parent) 
     for child in children: 
      p.drawString(CHILD_X, y, child.name); 
      y += SEP_Y 

Ok, так что прежде, магические значения в верхней части определяют положение x каждой модели, мое предложение состоит в том, что HOUSE_X < PARENT_X < CHILD_X, чтобы получить идентификацию, но это зависит от вас. Далее, START_Y, где мы начинаем с y и SEP_Y - это высота линии, которая будет увеличена для каждой нарисованной строки, вы увидите, что y увеличивается после каждого звонка до drawString.

Теперь я просто зациклился на всех моделях, получал связанные с ними объекты и печатал их, используя мои магические значения и увеличивая y на каждом шагу.

Надеюсь, это даст вам начало. Отсюда вы можете выбрать магические значения и точно определить, что должно быть напечатано на каждой строке.

+0

Спасибо. Это помогает остальным иметь смысл. –

Смежные вопросы