我正在创建一个产品编辑表单,我需要预先填充以前的数据表单.
我正在做以下事情:
Product(form):
product = TextField('name')
category = SelectField('category', choice=[(1,'one'),(2,'two')])
Run Code Online (Sandbox Code Playgroud)
在视图中:
form.product.data = 'A product name from the database'
form.category.data = 'a category name' #This does not work
Run Code Online (Sandbox Code Playgroud)
问题出在SelectField上.
我知道我可以在SelectField上设置一个'默认'值.但是,这发生在表单定义类中,并且我还没有来自sqlalchemy的查询对象.
那么,有没有办法在运行时在selectfield上添加默认值?
我有一些麻烦,想知道如何使用"让"形式.在下面的示例中,我想在本地绑定值"cols",以便稍后在函数中处理它.然而,我注意到的是,如果我使用"let"函数,则sel-opt-tmp函数将返回nil值而不是列表.
(defn sel-opt-tmp []
(let [cols "test"]))
(prn (sel-opt-tmp))
Run Code Online (Sandbox Code Playgroud)
*上面的代码返回一个nil值.
我理解"let"只绑定函数范围内的值,我不知道是否有办法将值传递给let范围.也许有一些我不知道的"回归"?或者这只是糟糕的设计,在这种情况下我根本不应该使用绑定(这往往会创建很长的函数链,尽管很难读)?
我试图通过它们的公共密钥来汇总一组地图的值.我有这个片段:
(def data [{:a 1 :b 2 :c 3} {:a 1 :b 2 :c 3}]
(for [xs data] (map xs [:a :b]))
((1 2) (1 2))
Final result should be ==> (2 4)
Run Code Online (Sandbox Code Playgroud)
基本上,我有一张地图清单.然后我执行一个理解列表,只采取我需要的键.
我现在的问题是,我现在如何总结这些价值观?我尝试使用"reduce"但它只适用于序列,而不是集合.
谢谢.
===编辑====
使用Joost的建议我得出了这个:
(apply merge-with + (for [x data] (select-keys x [:col0 :col1 :col2]))
Run Code Online (Sandbox Code Playgroud)
这将迭代一个集合并对所选键进行求和.我添加的"选择键"部分尤其需要避免在集合中的地图包含文字而不仅仅是数字时遇到麻烦.
我正在使用clojure和打嗝(黑色),我有这个代码:
(defn dataframe [id]
(db/db-to-data id))
(defpartial drop-downs [nms]
(for [nm (keys nms)] (drop-down nm (get nms nm))[:br])
(submit-button "Refresh")
)
(defpage "/dataset/table/:id" {:keys [id]}
(common/layout
(form-to [:post (format "/dataset/table/%s" id)]
(drop-downs {"alessio" [:col0], "test" [:col1]})
)
(html-table (dataframe id))))
Run Code Online (Sandbox Code Playgroud)
我的问题是:
(for [nm (keys nms)] (drop-down nm (get nms nm))[:br])
Run Code Online (Sandbox Code Playgroud)
我希望在我的表单中有多个选择.上面这一行就是这样,但由于某些原因,它不考虑[:br],所以它不会破坏这些行.但是,如果我这样做:
(form-to [:post (format "/dataset/table/%s" id)]
(drop-down "Test1" "1")[:br]
(drop-down "Test2" "2")[:br]
)
Run Code Online (Sandbox Code Playgroud)
[:br]标签确实有效.我相信这与(for)宏如何工作有关,但我无法弄清楚原因以及如何解决它.
编辑
据我所知,我放弃使用for.下面的最终结果(这是Joost以轻微模式回答):
(mapcat #(vector (drop-down % (nms %)) [:br]) (keys nms))
Run Code Online (Sandbox Code Playgroud) 我正在使用 hiccup 实现一个简单的下拉菜单:
;DATASET/CREATE
(defn get-cols-nms [table]
"This function gets the list of columns of a specific table".
(do (db/cols-list table)))
(defpartial form-dataset [cols-list]
(text-field "dataset_nm" "Input here dataset name")[:br]
(drop-down "table" tables-n)
(submit-button "Refresh")[:br]
(mapcat #(vector (check-box %) % [:br]) cols-list)
)
(defpage "/dataset/create" []
(common/layout
(form-to [:post "/dataset/create"]
(form-dataset (get-cols-nms (first tables-n))))))
(defpage [:post "/dataset/create"] {:as ks}
(common/layout
(let [table (ks :table)]
(form-to [:post "/dataset/create"]
(form-dataset (get-cols-nms table))))))
Run Code Online (Sandbox Code Playgroud)
我需要的是在特定表上选择下拉列表时发出发布请求(因为我认为这是唯一的方法,但我愿意接受建议)(以便“get-cols-nms”得到使用选定的表调用)。这样,当在下拉列表中选择数据库的表时,表列会自动显示。
所以,归根结底,重点是让我更好地理解这个函数:
(drop-down "table" tables-n)
Run Code Online (Sandbox Code Playgroud)
我认为要执行我想要的操作,我需要标签具有调用 javascript 函数的“onchange”属性。但我不知道:1)我是否可以使用 hiccup form-helper …
我有这个清单:
("a" "b" "c" "d" "e")
Run Code Online (Sandbox Code Playgroud)
我想在第一个位置移动"d":
("d" "a" "b" "c" "e")
Run Code Online (Sandbox Code Playgroud)
有没有直接的方法来做到这一点?
编辑
谢谢你的回答.我看了一下它,我这样做了:
(defn move-item [data item-to-move]
(conj (remove #(= % item-to-move) data) item-to-move))
(move-item ["a" "b" "c" "d" "e"] ["d"])
Run Code Online (Sandbox Code Playgroud)
我不确定这是不是很好的设计,但它可以解决问题.
我需要在背景图像的底部放置一个文本元素.
<div style="background-image: url('http://www.hdwallpapersinn.com/wp-content/uploads/2013/03/1325120512b60-45927-1.jpg'); height:100px">
<p class="caption">Test</p>
</div>
.caption{
position: absolute;
bottom:0;
}
Run Code Online (Sandbox Code Playgroud)
正如你在这里看到的:http://jsfiddle.net/K98CR/
这会将元素放置在页面底部而不是背景图像的底部.我对"底部"属性的理解是它可以相对于其父元素,但在这种情况下它不起作用.
我错过了什么?或任何其他方式来实现这一目标?使用margin-top不是一个选项,因为我正在创建一个流畅的布局,这将取决于屏幕比例,我不希望这样.
我想要的是一种将元素放置在其父元素底部的方法.在这种情况下,我想将文本放在使用"background-image"设置样式的图像的底部.