Пример использования: использование формы для ввода оценок по каждому курсу, на который зачислен учащийся.
Модель:
Используя SQLAlchemy, я определил объект Student
, объект Course
и объект ассоциации StudentCourse
, в которых хранится оценка каждого учащегося по каждому курсу.
class Student(Base):
__tablename__ = 'students'
id = Column(Integer, primary_key=True)
name = Column(Text)
courses = association_proxy('student_courses', 'grade',
creator=lambda k, v: StudentCourse(course_title=k, grade=v))
...
class Course(Base):
__tablename__ = 'courses'
id = Column(Integer, primary_key=True)
title = Column(Text, unique=True)
...
# Link students to courses and store grades
class StudentCourse(Base):
__tablename__ = 'student_courses'
student_id = Column(Integer, ForeignKey(Student.id), primary_key=True)
course_id = Column(Integer, ForeignKey(Course.id), primary_key=True)
grade = Column(Integer)
student = relationship(Student,backref=backref(
'student_courses',
collection_class=attribute_mapped_collection('course_title'),
cascade='all, delete-orphan'))
course = relationship(Course)
@property
def course_title(self):
if self.course is not None:
return self.course.title
else:
return self._course_title
...
Просмотр:
Я могу запросить модель StudentCourses и создать соответствующую форму, но не могу понять, как передать/получить данные из запроса в виде объекта.
def view(request):
student = Student.from_request(request)
student_courses = DBSession.query(StudentCourse).\
filter(StudentCourse.student_id == student.id).\
all()
class GradesForm(Form):
pass
# Add form field for each course the student is enrolled in
for c in student_courses:
setattr(GradesForm,
c.course_title,
IntegerField()
)
form = GradesForm(request.POST, obj=student_courses) # this doesn't populate the form
return {'form': form}
Это создает пустую форму, поэтому я, очевидно, не могу заполнить форму данными непосредственно из объекта Query
. Но мне не удалось заполнить форму любым объектом, даже при создании формы с типом FormField
для каждого курса:
class StudentCourseForm(Form):
course_title = StringField()
grade = IntegerField()
def view(request):
...
class GradesForm(Form):
pass
# Add form field for each course
for c in student_courses:
setattr(GradesForm,
c.course_title,
FormField(StudentCourseForm)
)
form = GradesForm(request.POST, obj=student_courses)
return {'form': form}
Использование запроса, если это возможно, было бы самым простым. Согласно документам SQLAlchemy, использование метода query()
в сеансе создает объект Query
. При повторении, как я сделал в своем контроллере, этот объект представляет собой список StudentCourse
объектов.
[<app.models.StudentCourse object at 0x10875bd50>, <app.models.StudentCourse object at 0x10875bed0>]
...и мой прогресс заканчивается здесь. Любая помощь приветствуется!
class GradesForm(Form): pass
затемfor course in courses: setattr(GradesForm, course.name, TextField(course.name, validators=[Required()]))
для примера :-) - person Sean Vieira   schedule 11.01.2014form.populate_obj(user)
). - person bfin   schedule 11.01.2014