[英]Web server ini-file editor using django
我希望通过Web服务器编辑ini文件,决定使用django,现在已经使用了几天。 我不知道如何做到这一点。 我的ini文件结构如下所示:
{'GROUP', {PROPERTY : VALUE}}
当我阅读这种ini文件的例子:
[LOG]
FilePath = C:/Log
[CMD]
Level = 5
我将像这样填充数据结构:
{'LOG', {'FilePath' : 'C:/Log',},
{'CMD', {'Level', '5'}}}
循环看起来像这样:
for group in settingsDict:
print group # group
for property in settingsDict[group]:
print property , # property
print settingsDict[group][property] # value
我正在使用ini文件解析器 。
我在理解如何正确地在django中开发时遇到了麻烦: views.py
是django的某种控制器,模板是视图和模型,将是我的ini文件(可能是使用django模型与db链接),还是我出了点问题?
我毫不费力地将此字典传递给模板,在其中进行for循环并创建html标签,例如: <input type="text" name={{ property }} value={{ value }} maxlength="100" />
。 但是,然后我该如何将所有编辑后的值发回控制以将它们保存在文件(或数据库)中呢? 我将需要所有3个值,即GROUP, PROPERTY and VALUE
。
然后我发现django也有html小部件,您可以在views.py
创建它,然后将其传递给模板。 但这是我停止理解事物的地方,因为我正在控制器类中创建小部件,即使我是。
我应该创建所有django小部件的列表并将其传递给模板吗? 发生相同的问题,如何将所有小部件值都返回给控制器(views.py)?
更新(11.6.2012):我的代码如下:views.py
class DynForm(forms.Form):
def setFields(self, kwds):
keys = kwds.keys()
keys.sort()
for k in keys:
self.fields[k] = kwds[k]
def settings(request):
global Settings #my ini dict
kwargs = {}
for group in Settings:
for property in Settings[group]:
kwargs[property] = forms.CharField(label = property, initial = Settings[group][property])
f = DynForm()
f.setFields(kwargs)
return render_to_response('/settings.html',
{
'textWidget' : f,
})
@csrf_exempt
def save(request):
if request.method == 'POST': # If the form has been submitted...
form = DynForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
# process form data
# and return response
settings.html
<form action="/save/" method="post">
{% csrf_token %}
{% for field in textWidget %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label }}: {{ field }}
</div>
{% endfor %}
<p><input type="submit" value="Save" /></p>
</form>
问题是, DynForm(request.POST)
返回null,所以我无法获取字段值。 我的request.POST是正确的,包含所有字段和值。 据我所知,我不是应该解析request.POST数据吗?
好的,终于弄清楚了,这花了我很多时间(我缺少很多python和django知识)。 由于版权保护,我无法粘贴最终解决方案,这是概念:
Form
class DynamicForm(forms.Form):
def __init__(self,*k,**kw):
forms.Form.__init__(self,*k,**kw)
# loop over data from **kw
# create field
# set field default value
关于此代码的注释:
super(SuperForm, self).__init__(*args, **kwargs)
,则必须使用forms.Form.__init__(self,*k,**kw)
以便可以使用self将字段附加到form .fields属性。 self.data[field] = defVal
而不是initial = defVal
。 表单变为未绑定,您将无法解析request.POST方法中的数据。 未绑定的表单(有错误)将始终返回is_valid() False
。 使用此类,您可以轻松解析request.POST
数据。 循环遍历动态表单字段如下所示:
View
for name,field in form.fields.items():
# name - field name
# form.data[name] - field value
笔记:
模板代码在表单中的字段上循环显示字段标签和值,并用分隔:
Template
<form action="/Tris/save/" method="post">
{% csrf_token %}
{% for field in textWidget %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.non_field_errors }}
{{ field.label }}: {{ field }}
</div>
{% endfor %}
<p><input type="submit" value="Save" /></p>
</form>
大多数解决方案都来自这里: http : //jacobian.org/writing/dynamic-form-generation/和django文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.