2015-09-28 5 views
2

Я немного новичок в создании веб-фрейма с использованием Pyramid и до сих пор делал довольно хорошо. В настоящее время я борюсь с тем, что кажется простой задачей. У меня есть форма, которая позволяет пользователям вводить информацию и рейтинги (через POST), чтобы эта информация могла заполнять базу данных, которую я создал, используя SQLALCHEMY.Как получить route_url со страницы для реализации в форме

Форма составлена ​​из таблиц 4 db (например, информация о пользователях, категориях и элементах, а также текстовое поле с обратной связью). Я построил view_config для этой формы HTML, используя комбинацию request.params['something_to_check'] и CRUDAPI (который дополняет проект RESTful).

Проблема: 1. Я пытаюсь получить идентификатор с страницы оценки, на которой существуют формы, и связать ее с формой (возможно, как скрытое поле, поэтому я могу использовать request.params и использовать свой API (как как показано ниже).

Я прочитал здесь post на стеках аналогичного экземпляра, но эта функция является единственной функцией, выполняющей все формы, а не функцию, предназначенную для сопоставления идентификатора. В Pyramid есть хорошие документы grabbing resources, но я не уверен, что это то, что я ищу в этом экземпляре. Как мне реализовать что-то подобное в моем коде/форме? Также, я не с использованием фляжки - я использую JINJA2 templa тес.

Маршруты для вида (маршрутные объекты, оценка, нет в списке):

config.add_route('save_assessment_result', '/save_assessment_result') 
config.add_route('create_assessment_form', '/create_assessment_form') 

views.py

@view_config(route_name='save_assessment_result', renderer='templates/assessment_form.jinja2') 
def form(request): 
    with transaction.manager: 
     username = request.params['username'] 
     firstname = request.params['firstname'] 
     lastname = request.params['lastname'] 
     email = request.params['email'] 
     owner = api.create_user(username, firstname, lastname, email) 

     assessment_id = int(request.params['id']) 
     assessment_obj = api.retrieve_assessment(assessment_id) 
     assessment_results = api.create_assessment_results(owner, assessment_obj) 

     category_rating_int = int(request.params['category_rating_int']) 
     category = request.params['category_name'] 
     category_rating = api.create_category_rating(category_rating_int, category, assessment_results) 

     element_rating_int = int(request.params['element_rating_int']) 
     element = request.params['element_text'] 
     element_rating = api.create_element_rating(element_rating_int, element, assessment_results) 

     text = request.params['text'] 
     comment = api.create_comment(text, element, assessment_results) 

     transaction.commit() 
     return {} 

форма дзиндзя шаблон

<form method='POST' action='/save_assessment_result' autocomplete="on"> 
    <div class="form-group"> 
    <input type="hidden" name="assessment_id" value='{{assessment_id}}'/> #suppose to find assessment page id 
    <dl class='user_form'> 
     <dt><label for = 'username'> Username </label></dt> 
     <dd>{{ forms.input('username') }}</dd> 
     <dt><label for = 'firstname'> Firstname </label></dt> 
     <dd>{{ forms.input('firstname') }}</dd> 
     <dt><label for = 'lastname'> Lastname </label></dt> 
     <dd>{{ forms.input('lastname') }}</dd> 
     <dt><label for = 'email'> Email </label></dt> 
     <dd>{{ forms.input('email') }}</dd> 
     <dd><input type="submit" name="submit" value="Submit" /></dd> 

     # MODE CODE for adding ratings... 
    </dl> 
+0

Можете ли вы это немного разъяснить? Что тебе нужно? Предложение очень длинное, и я попытался его разобрать, но не смог :(Проблема: 1. Мне нужно запросить route_uri с страницы идентификатора страницы оценки, которую пользователь вводит в свою информацию/рейтинги, чтобы я мог легко подключить это к API для объединения как пользовательских результатов, так и страницы оценки в сущность, это называется оценочными_выходами, которые используют пользователя и оценку, например api.create_assessment_results (владелец, оценка). –

+0

@MikkoOhtamaa Я немного очистил его для уточнения. – thesayhey

ответ

1

Если Я прочитал его правильно у меня бы сделать это следующим образом:

Добавление маршрута:

config.add_route('success', '/success/{assessment_id}') 

Тогда вид:

@view_config(route_name='success', renderer='templates/assessment_form.jinja2') 
def form(request, assessment_id): 
    with transaction.manager: 
     ... 

Re-POST assessment_id скрытое поле, как вы делаете.

Получение маршрута:

url = request.route_url("success", assessment_id=assessment.id) 

Примечания: вам не нужно использовать transanction.manager, как вы можете автоматически завернуть все HTTP-запросы на свои собственные операции.

Надеется, что это помогает!

+0

Спасибо Микко Будет рассмотрен совет по использованию диспетчера транзакций. Это помогло прояснить некоторые вещи! – thesayhey

0

Рабочий способ вытащить идентификатор от страницы пользователь будет работать на (через форму) выглядит следующим образом:

  • клиент посещает некоторую форму: http://.../assessment/23.
  • сервера соответствует маршрут и посылает контроль до view код для /assessment/{id}.
  • View код использует id = int(request.matchdict['id']) для загрузки assessment_object = api.retrieve_assessment(id) и заполнит и Возвращает dict, как в:

Пример:

def assessment_form_view(request): 
    #some code 
    return {'assessment_id': id, 'video_url': assessment_object.video_url, ...} 

Дзиндзя оказывает форму с помощью template_data на assessment_form_view с помощью @view_config(..., renderer='some_template').

Форма должна показать:

<form ... action="/save_assessment_result" method="POST"> 
    <input type="hidden" name="assessment_id" value="{{ assessment_id }}" /> 
    ... 
</form> 

Клиент подает это.
Сервер соответствует route/save_assessment_result с request_method='POST', передает управление связанной вид функции def save_assessment_result_view(request):

Это view function (1) тянет всю необходимую информацию из request.params, (2) называет api.create_user(...) и api.create_assessment_result(...) и (3) returns в HTTP redirect к некоторые другие route, /assessments.

Большие статьи, которые строят от того, что я реализовал это this (обсуждение

Объект запроса обрабатывается видом отзывной будет иметь параметры формы, хранящейся в объекте, называемом Params. Получение значения формы много, как и в других языках, которые используют их объект запроса возвращать значения формы: firstname = request.params['firstname'] и lastname = request.params['lastname']

и this (охватывающий скрытый код, найденный в форме - как показано выше).

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

  • Нет связанных вопросов^_^